реальное недоразумение - PullRequest
0 голосов
/ 08 марта 2012

Может кто-нибудь объяснить мне, почему этот блок кода не работает.Я просматривал некоторые вопросы вокруг, но не смог найти ответ.Вероятно, из-за (огромного) недостатка знаний.

Спасибо за любую помощь.

char** sentence = malloc(min);
char* temp = malloc(min2);
int i = 0;

while(i<5)
{
    sentence = realloc(sentence, i+2);
    scanf("%s", temp);
    sentence[i] = malloc(strlen(temp));
    strcpy(sentence[i], temp);
    printf("%s\n", sentence[i]);
    i++;
}

Ответы [ 4 ]

3 голосов
/ 08 марта 2012

Вы забыли учесть тот факт, что строки имеют нулевые терминаторы.

1 голос
/ 08 марта 2012
sentence[i] = malloc(strlen(temp));

Должно быть:

sentence[i] = malloc(strlen(temp)+1);

Требуется достаточно места для длины строки (strlen) И также для ее нулевого терминатора.

0 голосов
/ 08 марта 2012
sentence = realloc(sentence, i+2);

является распространенным анти-паттерном. Если realloc возвращает NULL, вы только что слили предложение. Вместо этого вам нужно написать

temp = realloc(sentence, i+2);
if(temp == NULL)
  // out of memory - do something here
sentence = temp;

Чтобы сделать жизнь хуже, вы используете

  • использование scanf, которое является частой причиной ошибок безопасности
  • с использованием strcpy, что является частой причиной ошибок безопасности
  • не проверяет результат любых ваших malloc для проверки, возвращает ли он NULL (если этого не произойдет, вы получите нарушение прав записи)
  • Не добавлять +1 к strlen () перед вызовом malloc и, следовательно, получать 1-байтовое переполнение кучи от strcpy.
  • И использование цикла while, где цикл for будет более подходящим.

Помимо этих шести ошибок безопасности, у вас все хорошо.

0 голосов
/ 08 марта 2012
sentence = realloc(sentence, (i+1) * sizeof(*sentence));

будет иметь больше смысла: вы пытаетесь сохранить i+1 char* с, а не i+2 байт .

Кстати, вы можете просто заменитьmalloc / strlen / strcpy с:

sentence[i] = strdup(temp);

(который заботится о нулевом терминаторе для вас).

...