我在这里浏览了C中的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 = %un", str, str);
/* Reallocating memory */
str = (char *) realloc(str, 25);
strcat(str, ".com");
printf("String = %s, Address = %un", str, str);
free(str);
return(0);
}
据我所知,malloc()最初将字符串分配为15字节长,然后realloc(()将其重新分配为25个字符长。但是,即使我从代码片段中删除了realloc()语句,它怎么仍然可以正常工作呢?我是不是错过了什么?
但是,即使我从代码片段中删除了realloc()语句,它怎么仍然可以正常工作呢?
如果删除realloc()
,也许代码运行良好,但这是一个意外。代码仍然是错误的,缓冲区溢出,结果是"未定义的行为"——这意味着它可能工作正常,可能崩溃,可能给出错误的答案,可能格式化硬盘驱动器——它可能会做任何的事情。
修复您的代码。
如果您使用的是GCC 4.8或更新版本,我建议您使用地址消毒剂。像这样编译你的代码:
gcc main.c -o main -fsanitize=address -Wall -Wextra
^^^^^^^^^^^^^^^^^^
这需要在您的系统上安装地址清理程序库。或者,在Valgrind的memcheck工具中运行代码。
valgrind ./main
这两个工具都会显示您的程序是错误的。