malloc(0)的问题

http://blog.csdn.net/js_xj/article/details/5826042

解答:

首先来解释malloc(0)的问题,这个语法是对的,而且确实也分配了内存,但是内存空间是0,就是说返回给你的指针是不能用的,感觉奇怪吧?但 是从操作系统的原理来解释就不奇怪了,这要涉及操作系统维护内存的方法来说了,在内存管理中,内存被分为2部分,栈和堆,栈有自己的机器指令,是一个先进 后出的数据结构,我就在这里不再过多解释了,malloc分配的内存是堆内存,由于堆没有自己的机器指令,所以要有系统自己编写算法来管理这片内存,通常 的做法是用链表,在每片被分配的内存前加个表头,里面存储了被分配内存的起始地址和大小,你的malloc返回的就是表头里的起始指针,这个地址是由一系 列的算法得来了,通常不会为0,一旦分配成功,就返回一个有效的指针,对于分配0空间来说,算法已经算出可用内存的起始地址,但是你占用0空间,所以对那 个指针操作就是错误的,操作系统一般不知道其终止地址,因为有占用大小就可以推出终止地址,还有就是即使分配0空间也要释放它,其实是释放的链表结点

还有,返回的指针是可用地址的起始地址,虽然你可以无限赋值,但是其实是错误的,因为可能有其他有用的数据在那一片区域,如果指针越界就会出现意想不到的事情。

时间: 2024-07-31 10:28:21

malloc(0)的问题的相关文章

ptr = malloc(0);

#include <stdio.h> #include <stdlib.h> #include <string.h> /* 避免错误: size 进行判断后在进行动态分配. 为什么? malloc在不同编译器上有不同的实现,有的申请0大小返回NULL, 有的就可以返回一个地址,似乎后者较为常见. 当malloc分配内存时它除了分配我们指定SIZE的内存块,还会分配额 外的内存来存储我们的内存块信息,用于维护该内存块. 其实内存是分片的, 比喻说你malloc(10):

malloc 0

buf = malloc(0) //buf为一个有效的地址 buf = malloc(1.5)   //buf为一个有效的地址 buf = malloc(-1) //buf为NULL free(NULL) //编译不会报错,运行也没问题,不清楚是否存在影响例如:char *buf = NULL;buf = malloc(4); memset(buf,0,4); free(buf) buf = NULL; free(buf); 原文地址:https://www.cnblogs.com/baidub

malloc(0)分配多少内存?(译文)

原文地址:http://prog21.dadgum.com/179.html 在大多的系统中,这个C的小程序将会吸收全部空闲的内存. while(1){ malloc(0); } 在我们聊malloc(0)之前,让我们看看malloc(1)这个更简单的情况. 这有一个关于malloc的新的有趣的C程序问题:"用一个指针去动态的分配内存,我们能怎样决定它指向多少字节(byte)?"这个答案是令人沮丧的"你不能决定."但是当你调用free在相同的指针,内存分配知道这个块

C语言malloc(0)情况分析

https://blog.csdn.net/zhoujian0827/article/details/78354151 https://blog.csdn.net/shimadear/article/details/80291194 https://blog.csdn.net/fovwin/article/details/8170914 //软件编写时,应避免出现malloc(0)的情况. 原文地址:https://www.cnblogs.com/retry/p/11055534.html

malloc()参数为0的情况

下面的代码片段输出是什么?为什么? char *ptr; if((ptr = (char *)malloc(0))==NULL) puts("Got a null pointer"); else puts("Got a valid pointer"); 解析:......故意把0值传给了函数malloc,得到了一个合法的指针,这就是上面的代码,该代码的输出是"Got a valid pointer". 这个"解析"根本就没有解

malloc()參数为0的情况

以下的代码片段输出是什么?为什么? char *ptr; if((ptr = (char *)malloc(0))==NULL) puts("Got a null pointer"); else puts("Got a valid pointer"); 解析:......有益把0值传给了函数malloc.得到了一个合法的指针,这就是上面的代码,该代码的输出是"Got a valid pointer". 这个"解析"根本就没有解

关于malloc(0)的对与错

大家都知道malloc(-1)是错的,但是malloc(0)到底是对还是错呢? 在以前我也没有考虑过,只知道malloc(0)是没有申请任何空间的,是没法往里面写入东西的,但是我在linux上和window编译时却让我出乎意料,它既然没有报错,可以输入和输出,看一个例子大家就知道了: window上运行结果: linux上运行结果: 我一直在想为什么会能正确的输入和输出,是自己很苦恼,按道理说它是错的,让自己很苦恼 经过查找资料终于明白了,原来 char* p = (char *) malloc

malloc和free的内存到底有多大?——GNU glib库

大家应该都比较熟悉这一点:malloc分配的内存一定大于用户指定的大小!而且很多人也问过这样的问题:到底大多少?以及实际上malloc到底分配了多少? 我们知道这个大小一定在某个"神奇"地方记录着,但是就像自己的"思维"一样,你确无法感知!不过,这是错觉,只是我们习惯了只使用,而没有深入剖析源码,在这里我将揭开这个面纱,去掉其透明化! 声明:源码基于GNU glib库的2.7版本的malloc目录下相关文件 再声明:不同的C库实现方式不一定一样,这里是glib库,如

New与malloc的区别

http://blog.sina.com.cn/s/blog_6fc5bfa90100qgd7.html1,malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符.它们都可用于申请动态内存和释放内存. 2, 对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求.对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数.由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强