printf падает после успешной печати

Язык - C. У меня есть массив типов char* (char *array[] / char** array) в качестве аргумента функции, и я хочу вывести их все в отдельные строки, например:

    while (*array) {

      printf("%s\n", *array);
      printf("after last print");
      array++;
    }

Теперь по какой-то причине при определенном вводе ему удается распечатать все значения, но сразу же происходит сбой после печати последнего * массива. Таким образом, после последнего printf он больше не печатает "после последней печати". К сожалению, я на Windows 7 с поддержкой NetBeans C, без GDB. Были некоторые проблемы, когда я пытался установить его на NetBeans, но это другая история.

Прежде всего, что может быть причиной этого? Во-вторых, как я могу без GDB попытаться отладить это поведение лучше всего? Если кто-то даст ответ, который поможет мне отладить проблему и решить ее таким образом, я получу баллы и от этого в одиночку. Некоторая справочная информация, относящаяся к аргументу функции, вызывающему сбой: я использовал strtok для генерации char** arr из строки char*, где в качестве разделителя использовался пробел.

РЕДАКТИРОВАТЬ:

Еще немного информации: если я внутри той же функции пытаюсь напечатать последний * массив, он работает нормально, и программа продолжает работать нормально. Так что это работает:

printf("%s\n", array[4]);

Последний индекс перед NULL в моем тестовом случае равен 4. Но затем, когда та же самая вещь выполняется внутри цикла, как было показано ранее, ей удается ее распечатать, но сразу же вылетает, не печатая вторую строку.

2 ответа

Решение

Если вы явно не инициализируете последний элемент вашего строкового массива как нулевой, он будет неинициализирован (т.е. дикий указатель), поэтому при разыменовании его в printf это потерпит крах.

Список задач:

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

Этот код прекрасно работает для меня и не вылетает:

#include <stdio.h>
char *array[] = { "Hello", "World", "My", "Name", "Is", "Govind", "Parmar", NULL } ;

int main()
{   
    int i;
    for(i = 0; *(array+i); i++)
    {
        printf("%s\n", *(array+i));
    }
    printf("after last print\n");
    return 0;
}

Я закомментировал код, который появляется после использования этой функции. Это привело к полностью успешному запуску кода. Очевидно, что порядок выполнения кода не был линейным в том смысле, что он выполнялся строка за строкой. Но после последней печати * массива он пытался выполнить код, следующий за функцией. Теперь, когда я закомментировал этот код, функция работает как шарм.

Те, кого это интересует, закомментировал код, связанный с освобождением памяти из * массивов.

Другие вопросы по тегам