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)
换句话说,这是代码中的错误.