malloc小问题

来源:百度知道 编辑:UC知道 时间:2024/06/10 15:53:45
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
main()
{
char *p;
p=(char*)malloc(4*sizeof(char));
if(p)
printf("succeed!\n");
else
printf("failed!\n");
strcpy(p,"abcdefghijklnopqrstuvwxyz");
printf("%s\n",p);
}
运行结果:abcdefghijklnopqrstuvwxyz
我的本意是分配4字节的堆空间给p,但是我把长度为27的字符串复制到p指向的内存,为什么没有溢出?
至少gcc编译器没有提示任何错误,运行也没有出现什么异常!
高手帮我看看!谢谢了!

malloc后。p指向初始化地址空间的首地址,
在上述程序中,你只malloc了4个连续的char空间。

所以在这个4个char空间以后的存储区域,是未被初始化的,
有以下可能性:
1. 系统正在使用的区域
2. 别的程序正在使用的区域
3. 野地址/或者是未被使用的区域

由于malloc的特性,3的可能性较大。

所以你将长度为27的字符串复制到p指向的内存,虽然超出了初始化的区域,
但是却没有引起异常。

但是这样还是非常危险的,
因为还是有1,2的可能,所以有造成不可预见的地址访问/覆盖错误的风险。

至于编译器没有提示任何错误,这个取决于所使用的编译器。
有的编译器会报告waring,甚至是error。

sizeof(char) 这句中 char 没有确定的内存大小,如果想定义4个单元 可以用int 或者long 都行。用 malloc 定义指针类型的程序写法并不常用(在数据结构里经常使用)。

to 364761308,谁说char没有确定的内存大小,你可以自己在C里printf("%d",sizeof(char));看看。其实c是这样的,自动处理了溢出的expection。你可以把这当成是一个小bug,但是楼主最好不要这么去用。在C++里这么用的话就会抛出runtime_error。