电子产业一站式赋能平台

PCB联盟网

搜索
查看: 123|回复: 0
收起左侧

面试题:申请空间时malloc(0)会发生什么?

[复制链接]

317

主题

317

帖子

3149

积分

四级会员

Rank: 4

积分
3149
发表于 2024-10-9 14:17:00 | 显示全部楼层 |阅读模式


申请空间时malloc(0)会发生什么?
有读者提到以前面试的时候被问到过这个题,正好我刚毕业的时候也被问过,当时内心还一阵腹诽,这道面试题又是会被喷没有意义的题,个人也感觉研究这种没什么意义,不过知道下还是没有坏处的。
  • #include #include
    int main(){    char* p = (char*)malloc(0);    printf("Pointer address: %p
    ", (void*)p);
        return 0;}按照第一反应,这种时候应该返回空指针NUL,毕竟你没有申请到空间地址,动手实践在Windows上和Linux上分别运行,发现都打印出了地址
  • //WindowsPointer address: 000001ABC6A161B0
  • //linuxPointer address: 0xe5e260实际动手可以发现,mallc(0)返回的指针不是空指针。
    其实这种涉及到标准库的问题,直接看标准就行,cppreference上对malloc为0的情况有明确的说明:
  • mallocC Dynamic memory management Defined in header void *malloc( size_t size );
    If size is zero, the behavior of malloc is implementation-defined. For example, a null pointer may be returned. Alternatively, a non-null pointer may be returned; but such a pointer should not be dereferenced, and should be passed to free to avoid memory leaks.
    the behavior of malloc is implementation-defined.是什么意思?
    意思就是当malloc接收到一个大小为0的请求时,其行为是由实现定义的。也就是说不同的实现可以选择不同的处理方式。
    返回NULL:
    许多实现选择在这种情况下返回NULL,因为分配0字节的内存没有实际用途。
    返回非空指针:
    有些实现可能会返回一个非空指针。这个指针不应被解引用(dereference),并且应该传递给free函数以避免内存泄漏。

    总结:
    malloc(0)的返回值由实现编译器的人定义,可以是NULL,也可以是一个非空指针,深究没多大意义。
    end

    一口Linux

    关注,回复【1024】海量Linux资料赠送
    精彩文章合集
    文章推荐
    ?【专辑】ARM?【专辑】粉丝问答?【专辑】所有原创?【专辑】linux入门?【专辑】计算机网络?【专辑】Linux驱动?【干货】嵌入式驱动工程师学习路线?【干货】Linux嵌入式所有知识点-思维导图
  • 回复

    使用道具 举报

    发表回复

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则


    联系客服 关注微信 下载APP 返回顶部 返回列表