Malloc分配的空间太少,但代码编译并运行没有错误

时间:2014-11-23 05:33:34

标签: c pointers malloc

我希望看到此代码中的编译错误,并且可能在运行可执行文件时出错。根据我的理解,如果指针被分配并存在于堆中,并且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);
}

2 个答案:

答案 0 :(得分:0)

Malloc将返回大于5个字节的块。我猜它在实现上有所变化,但快速谷歌搜索说16个字节。

我不希望编译器产生编译错误(虽然可能是警告?)

答案 1 :(得分:0)

在C中,如果在没有添加某种边界检查的情况下发生缓冲区溢出,则不会发出错误或警告。由于您正在读写无效内存,因此代码的输出是未定义的。有时候你可能很幸运并且遇到了分段错误,你就知道你有违反访问权限。

通过运行valgrind ./test,您可以看到无效的读写操作。我鼓励您熟悉valgrind作为检测内存管理错误的调试工具,例如您在代码中引入的错误。