C - realloc()函数 - 证明它破坏了数据

Mik*_*mmm -3 c memory allocation dynamic realloc

看看我用这个简单的代码找到了什么:

#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;
}
Run Code Online (Sandbox Code Playgroud)

出口是:

BEFORE: initi1l wording cont2ining forty-nine ch3r4cters.
AFTER: initi1l wording cont2inia
Run Code Online (Sandbox Code Playgroud)

请注意字符串末尾的'a'!我不知道它来自哪里,也许在堆中的某个地方.它不是来自原始数据块.最初我使用realloc()与结构数组,它显然以更重要的方式破坏数据.

我该如何解决这个问题?

NPE*_*NPE 10

C字符串需要NUL终止符.你隐含地期望realloc()以某种方式弄清楚内存中包含一个C字符串,并用它替换它的最后一个字符NUL.它没有这样做; 你必须自己做:

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

换句话说,这是代码中的错误.


fri*_*zis 5

它不是!在C"String"中是一组用\ 0分隔的字符.在这种情况下,您尝试打印"字符串",因此您将获得原始的24个字符和一些尾部,直到在内存中找到随机\ 0