即使分配0字节,程序也可以工作。我做错了什么吗?
#include <stdio.h>
#include <stdlib.h>
int main()
{
char *str;
printf("memory address of str %p %pn",&str,str);
/* Initial memory allocation */
str = (char*)malloc(0);
printf("memory address of str %p %pn",&str,str);
strcpy(str,"abc");
printf(" string = %s %p %pn", str,&str, str);
free(str);
return(0);
}
来自malloc文档:
如果size为0,则返回值取决于特定的标准库实现(它可能是也可能不是空指针),但是返回不能对指针解引用。
Open Group说:
如果请求的空间大小为0,则行为为实现定义:返回的值要么为null指针或唯一指针。
这意味着当size为0时,malloc()返回NULL或一个唯一的指针,该指针可以在之后被释放。
我做错了什么吗?
是的,你做错的事情是:
str = (char*)malloc(0);
strcpy(str,"abc");
如果你分配0字节,那么你只允许在那里存储0字节。不是4 ('a', 'b', 'c'和结束的空字符)。
分配一些内存意味着为你保留内存,但是即使有些内存没有为你保留,你有时仍然可以对它进行写操作——就像没有什么能阻止你在超市把东西放进别人的手推车里一样。