我正在浏览C here 中的relloc示例。我无法确切地知道realloc()在这个片段中做了什么,因为即使我注释掉了realloc语句,程序也运行得很好。我再次在此处附加代码,以便更容易完成。
#include <stdio.h>
#include <stdlib.h>
int main()
{
char *str;
/* Initial memory allocation */
str = (char *) malloc(15);
strcpy(str, "tutorialspoint");
printf("String = %s, Address = %u\n", str, str);
/* Reallocating memory */
str = (char *) realloc(str, 25);
strcat(str, ".com");
printf("String = %s, Address = %u\n", str, str);
free(str);
return(0);
}
据我所知,malloc()最初将字符串分配为15个字节长,然后realloc()将其重新分配为25个字符长。但即使我从片段中删除realloc()语句,它仍然可以正常工作?我错过了什么吗?
答案 0 :(得分:2)
但即使我从代码段中删除realloc()语句,它仍然可以正常工作吗?
如果删除realloc()
,可能代码工作正常,但这是一个意外。代码仍然是错误的,它有一个缓冲区溢出,结果是&#34;未定义的行为&#34; - 这意味着它可能正常工作,它可能会崩溃,它可能会给出错误的答案,它可能会格式化您的硬盘 - 它可能会任何。
修复您的代码。
如果您使用GCC 4.8或更新版本,我建议使用地址清洁剂。像这样编译你的代码:
gcc main.c -o main -fsanitize=address -Wall -Wextra
^^^^^^^^^^^^^^^^^^
这需要在您的系统上安装地址清理程序库。或者,在Valgrind的memcheck工具中运行您的代码。
valgrind ./main
这两个工具都会显示您的程序错误。