即使我分配了0字节,程序也能正常工作。我做错了什么?
#include <stdio.h>
#include <stdlib.h>
int main()
{
char *str;
printf("memory address of str %p %p\n",&str,str);
/* Initial memory allocation */
str = (char*)malloc(0);
printf("memory address of str %p %p\n",&str,str);
strcpy(str,"abc");
printf(" string = %s %p %p\n", str,&str, str);
free(str);
return(0);
}
答案 0 :(得分:2)
来自https://gist.run/?id=5d047c561cf5973cf98e88bae12f4b4e文档:
如果size为零,则返回值取决于特定库 实现(它可能是也可能不是空指针),但返回 指针不得解除引用。
malloc说:
如果请求的空间大小为0,则行为为 implementation-defined:返回的值应为null 指针或唯一指针。
这意味着当size为0时,malloc()返回NULL或可以在之后释放的唯一指针。
答案 1 :(得分:0)
我做错了吗?
是的,你做错了是:
str = (char*)malloc(0);
strcpy(str,"abc");
如果分配0个字节,那么只允许存储0个字节。不是4('a','b','c'和终止空字符)。
分配一些内存意味着为你保留这些内存,但即使没有为你保留一些内存,你有时仍然可以写信给它 - 就像没有什么能阻止你把物品放在超市的别人手推车上一样。