2013-06-23 17 views
3

Когда я пытаюсь проходной следующей программой C, я получаю ошибку: «неисправность Сегментации: 11»C - Перебор массива указателей

#include <stdio.h> 

main() { 

int i; 

char *a[] = { 
    "hello", 
    "how are you", 
    "what is your name" 
}; 

for (i = 0; a[i][0] != '\0'; i++) { 
    printf("\n%s", a[i]); 
} 
} 

Но когда я заменить тест в цикле for со следующим, то я не получаю ошибку, и все работает нормально.

for (i = 0; i < 3; i++) { 
    printf("\n%s", a[i]); 
} 

Я бы очень признателен, если кто-то может объяснить мне, почему тест a[i][0] != '\0' не работает, и что я должен делать вместо этого.

+0

'for (i = 0; i <3; i ++) {...}' :: нет дозорного. – wildplasser

+1

Я думаю, что у всех остальных это есть, но я просто добавлю, что память после вашего массива не определена. На самом деле это возможно (1/256 раз, если у вас действительно есть память после массива), что ваш код будет работать. Это просто совершенно не определено. Массивы в C не имеют встроенного размера. Вы должны отслеживать размер параллельно с вашим массивом, поэтому ваша проверка <3 работает. Или, с sizeof, вы должны отслеживать тип. Когда вы передаете массив функции, он превращается в указатель, но вы теряете sizeof. – xaxxon

ответ

8

Вам необходимо иметь завершающую строку, которая отсутствует. Ваше определение a должно быть

char *a[] = { 
     "hello", 
     "how are you", 
     "what is your name", 
     "" 
    }; 

без пустой строки, вы обращаетесь к a[3], что не существует и, следовательно, неисправность сегм.

+1

Вы ответили на его вопрос, но у меня есть в стороне: использовал бы 'sizeof', чтобы определить окончание без необходимости дополнительной строки? (С другой стороны, это может быть уродливая арифметика указателя) – nonsensickle

+0

Спасибо. Это сработало хорошо. – Ben

+1

@nonsensical: вы можете использовать оператор 'sizeof', но вам придется использовать' sizeof (a)/sizeof (char *) '. В любом случае ОП задал причину segfault, и из его вопроса было очевидно, что он пытается завершить цикл по отсутствующему символу NULL. – unxnut

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