2015-02-19 5 views
0

Я пытаюсь передать массив указателей на строки (имена) в функцию (foo) и читать из нее. Приведенный ниже код вызывает ошибку сегментации. Может кто-то, пожалуйста, помогите мне выяснить, почему этот код приводит к ошибке сегментации? Я хочу иметь возможность передавать имена массивов [] [] через функцию и работать с данными, как если бы я использовал имена [] [] вне функции.Передача массива указателей на строки в функцию

void foo(char *bar[]) { 
    printf("%s\n", bar[0]); 
} 

//---------------Main------------- 

char args[][50] = {"quick", "brown", "10", "brown", "jumps", "5"}; 
int i = 0; 
int numbOfPoints = (sizeof(args)/sizeof(args[0]))/3; 

//array of all the locations. the number will be its ID (the number spot in the array) 
//the contents will be 
char names[numbOfPoints][100]; 

for(i = 0; i < numbOfPoints; i++) { 
    char *leadNode = args[i*3]; 
    char *endNode = args[i*3 + 1]; 
    char *length = args[i*3 + 2]; 
    int a = stringToInt(length); 

    //add name 
    strcpy(names[i],leadNode); 
} 

//printing all the names out 
for(i = 0; i < numbOfPoints; i++) { 
    printf("%s\n", names[i]); 
} 

foo(names); 
+0

lol Перед тем, как я отправил, я подвергал цензуре код на моей машине, но я забыл изменить его здесь. Хорошая благодарность. – bs7280

+0

Я удивлен, что вы не получили ошибок компилятора. 'names [i]' несовместимо с 'char * []'. Вы должны изменить 'foo (char * bar [])' на 'foo (char * bar)'. –

+0

У меня нет ошибок. Я запускаю его в блоках кода, и exe сбой. Это супер разочаровывает, потому что у меня нет никаких причин для ошибок. – bs7280

ответ

1

Проблема является тип аргумента foo и как вы вызываете его. Тип аргумента foo, char* [] не совместим с name. Я получаю следующее предупреждение в gcc 4.8.2 с -Wall.

soc.c:35:4: warning: passing argument 1 of ‘foo’ from incompatible pointer type [enabled by default] 
    foo(names); 
    ^
soc.c:5:6: note: expected ‘char **’ but argument is of type ‘char (*)[100]’ 
void foo(char *bar[]) { 

Изменить foo на:

void foo(char (*bar)[100]) { 
    printf("%s\n", bar[0]); 
} 

и все должно быть хорошо.

+0

Спасибо, это работает, но он просто распечатывает первый элемент в массиве. Как я могу распечатать любой элемент в массиве? – bs7280

+1

Вы можете напечатать 'bar [0]', 'bar [1]' и т. Д. Вы можете использовать цикл 'for' в' main' для этого. Вы также можете передать 'numbOfPoints' в' foo' и поместить цикл 'for' в' foo'. –

Смежные вопросы