开发者社区> 问答> 正文

malloc 分配0个字节问题

为什么这里的malloc 分配 0 个字节

#include <stdio.h>
#include <stdlib.h>
void main(void){
char *w="world";
char *h=(char*)malloc(0);
if(h==NULL){
    printf("分配内存出错");
    return;
}
sprintf(h,"hello %s",w);

printf("%s",h);
free(h);
}

使用gcc 编译 为什么我分配(char*)malloc(0); 不会出错! 我分配1也不会出错 这是为什么?那我应该怎么分配?

正常是 char h=(char)malloc(sizeof(char)*(strlen("hello world")+1)); 这样分配吗?

展开
收起
a123456678 2016-06-06 09:28:20 2491 0
1 条回答
写回答
取消 提交回答
  • malloc 是被允许分配 0 字节空间的。其返回值要么是 NULL,要么是可以被 free 的指针。我测试时它实际返回了一个指向堆空间的有效地址。
    你 sprintf 时已经越界了。这个指针指向的内存空间位于堆上,所以不会破坏栈空间。你没有分配更多的堆空间来使用,所以被覆盖的堆空间很可能是根本没有有效数据的部分,或者即使有数据你的程序也没有用到,因此没有崩溃。
    可以这样类比,你向某栋大楼请求分配了一个房间,但是实际却占用了同一层的所有房间。然而,由于当时这些被你非法占用的房间是闲置的,没有重要的东西被破坏,也没有和别人冲突,所以没有发生什么不好的事情。但很显然,你不会每次都这么好运。

    char h = malloc(sizeof(char)(strlen("hello world")+1)); 这样分配是正确的。在 C 语言中你不需要转换 malloc 返回的指针的类型。

    2019-07-17 19:27:35
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载