Массив указателей на символы в Си - различение пустых элементов - PullRequest
1 голос
/ 22 февраля 2012

У меня есть массив указателей на символы в C размером 10.

Я пытаюсь перебрать и распечатать каждую строку. Не все элементы заполнены, и я считаю, что это вызывает у меня ошибку. Как проверить, заполнен ли элемент.

Это то, что я пробовал. Когда я запускаю свой код, я обнаруживаю, что первый элемент заполняется, и значение печатается, но затем я получаю ошибку.

char *errors[10];
ret = doMessages(&h, errors);
for (i = 0; i < 10; i++)
{
    if(errors[i] != NULL)
    {
        printf("%s", errors[i]);
    }
}

Ответы [ 3 ]

4 голосов
/ 22 февраля 2012

errors не инициализируется, поэтому элементы могут иметь любое значение, в частности, не может быть NULL.Изменить на:

char *errors[10] = { 0 }; /* Initialise all elements to NULL. */
0 голосов
/ 22 февраля 2012

Вы явно не инициализируете значения в вашем массиве как NULL, поэтому они содержат все, что раньше существовало, в той области памяти, где хранится ваш массив.

Для инициализации используйте что-то вроде

char *errors[10] = { 0 };

Вы можете сделать то же самое с memset:

char *errors[10];
memset(errors, 0, sizeof(errors));
0 голосов
/ 22 февраля 2012

Ну, наверное, только первый элемент errors заполнен.Остальные значения являются мусором (может быть NULL и может быть чем угодно), поэтому ваша проверка (!=NULL) на самом деле не проверяет заполнение элемента.

Я предлагаю вам инициализировать ваш массив до doMessages, (что-то вроде char *errors[10]={0};, и тогда проверка errors[i]!=NULL будет иметь смысл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...