我正在尝试随机的事情来了解更多关于malloc,realloc和free以及它们在一起使用时的行为方式。
我会将代码和我的想法包含在我想要做的事情中。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(void)
{
char *str;
/* Initial memory allocation */
str = (char *) malloc(15);
strcpy(str, "63tczfqV4nqB2YnH9iFJbGvGyyDkvK341rrj0G0mo1PEYniOVHejVIFIQnJzHSSMRbuyGMCZ4M5HFMV4y1q4QgYqyxp2XkTjxaolKTkaw1r25S2Emz061tw1");
printf("String = %s, Address = %u\n", str, *str);
/* Reallocating memory */
str = (char *) realloc(str,16);
strcat(str, "12345678");
printf("String = %s, Address = %u\n", str, *str);
free(str);
return 0;
}
确切的错误是:
***** glibc detected *** ./a.out: realloc(): invalid next size: 0x0000000001690010 *****
并且控制台挂在这上面,也就是说,它从未移过 realloc 这一行?
答案 0 :(得分:4)
让我们看一下代码的前两行:
str = (char *) malloc(15);
strcpy(str, "63tczfqV4nqB2YnH9iFJbGvGyyDkvK341rrj0G0mo1PEYniOVHejVIFIQnJzHSSMRbuyGMCZ4M5HFMV4y1q4QgYqyxp2XkTjxaolKTkaw1r25S2Emz061tw1");
此时,您已经破坏了C语言的规则。 strcpy
将写入str
的末尾,导致未定义的行为。
在这一点之后发生的一切都有点在空中。