C - функция realloc () - доказательство того, что она искажает данные - PullRequest
0 голосов
/ 28 октября 2011

Посмотрите, что я нашел с помощью этого простого кода:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char *string;

int main(){    

string = (char *) malloc(50*sizeof(char));
strcpy(string, "initi1l wording cont2ining forty-nine ch3r4cters.");
printf("BEFORE: %s\n", string);
string = (char *) realloc(string, 24*sizeof(char));
printf("AFTER: %s\n", string);

system("PAUSE");

return 0;
}

Выход:

BEFORE: initi1l wording cont2ining forty-nine ch3r4cters.
AFTER: initi1l wording cont2inia

Обратите внимание на 'a' в конце строки!Я понятия не имею, откуда это, может быть, где-то в куче.Это не из исходного блока данных.Первоначально я использовал realloc () с массивами структур, и он явно повредил данные более значительными способами.

Как я могу обойти эту проблему?

Ответы [ 4 ]

10 голосов
/ 28 октября 2011

Для строк C требуется терминатор NUL. Вы неявно ожидаете, что realloc() каким-то образом выяснит, что память содержит строку C, и заменит свой последний символ на NUL.Это не делает этого;Вы должны сделать это самостоятельно:

string = (char *) realloc(string, 24*sizeof(char));
string[23] = 0;   // <========= THE FIX
printf("AFTER: %s\n", string);

Другими словами, это ошибка в вашем коде.

5 голосов
/ 28 октября 2011

Это не так! В C "String" - это набор символов , ограниченный \ 0 . В этом случае вы пытаетесь напечатать «строку», поэтому вы получаете 24 исходных символа и хвост, пока в памяти не обнаружится случайный \ 0

2 голосов
/ 28 октября 2011

Строки в C заканчиваются нулем. Я удивлен, что программа не вылетела.

1 голос
/ 28 октября 2011

Это персонаж 25, и у вас нет 0-конца в первых 24.

...