我希望看到此代码中的编译错误,并且可能在运行可执行文件时出错。根据我的理解,如果指针被分配并存在于堆中,并且malloc为指针保留空间,如果指针放置的内容太大,它应该开始覆盖代码空间。但是,这在Linux 64位Ubuntu 14.04上没有问题。
在这个例子中,我最初保留5个字节,但在该存储器地址放置21个字节(\ 0将是字节21?)。程序运行没有问题,编译器不会抛出任何错误。
我使用命令编译:" gcc -Wextra -pedantic test.c -o test"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char *str;
/* Initial memory allocation */
str = malloc(5);
strcpy(str, "12345678901234567890");
printf("String = %s, Address = %p\n", str, str);
/* Reallocating memory */
str = realloc(str, 26);
strcat(str, "12345");
printf("String = %s, Address = %p\n", str, str);
free(str);
return(0);
}
答案 0 :(得分:0)
Malloc将返回大于5个字节的块。我猜它在实现上有所变化,但快速谷歌搜索说16个字节。
我不希望编译器产生编译错误(虽然可能是警告?)
答案 1 :(得分:0)
在C中,如果在没有添加某种边界检查的情况下发生缓冲区溢出,则不会发出错误或警告。由于您正在读写无效内存,因此代码的输出是未定义的。有时候你可能很幸运并且遇到了分段错误,你就知道你有违反访问权限。
通过运行valgrind ./test
,您可以看到无效的读写操作。我鼓励您熟悉valgrind
作为检测内存管理错误的调试工具,例如您在代码中引入的错误。