2016-06-25 2 views
0

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

while (*array) { 

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

Теперь по какой-то причине, с определенным входом, ему удается распечатать все значения, но сразу же после сбоя последнего массива будет аварийно завершен. Поэтому после последнего printf он больше не печатает «после последней печати». К сожалению, я на Windows 7 с поддержкой netbeans C, без gdb. Были проблемы, когда я пытался установить его в netbeans, но это еще одна история.

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

EDIT:

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

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

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

+0

Вероятно, последний элемент массива не задан с помощью указателя «NULL». Вам понадобится нечто вроде 'array [n] = NULL;', где 'n' - количество строк. Разумеется, для '' aray' потребуется комната для элементов 'n + 1'. –

ответ

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; 
} 
+0

Я тестировал, а последний - NULL, и все равно он падает сразу после того, как ему удается распечатать последний * массив, но больше не печатает последний «после последней печати» = /. –

+0

@ VilleMiekk-oja см. Мой отредактированный ответ –

+0

Используя ваш код, я смог получить программу до состояния, когда она печатает после последней печати, перед сбоем. После этого он падает на свободные от памяти функции. Я не понимаю, почему он не распечатывал его в моей версии кода, даже если он явно падает до кода, который приходит после функции. Но ваш код сделал это как-то, поэтому я дам вам правильный ответ. –

0

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

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

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