malloc(0)返回什么地址?
2010-08-13 16:26
197 查看
问题内容:malloc(0)返回什么地址?
原讨论链接:http://community.csdn.net/expert/topicview1.asp?id=4351400
所属论坛:C语言 审核组:C/C++
提问者:jidahyx 解决者:steedhorse
感谢:steedhorse
关键字:
答案:
char *p = (char *)malloc(0);
strcpy(p, "hello");
printf("%s/n",p);
free(p);
其中,p中的地址是堆内的首地址?
---------------------------------------------------------------
C99标准(ISO/IEC 9899:1999 (E))上说:
If the size of the space requested is zero, the behavior is implementationdefined:
either a null pointer is returned, or the behavior is as if the size were some
nonzero value, except that the returned pointer shall not be used to access an object.
如果所请求的空间大小为0,其行为由库的实现者定义:可以返回空指针,也可以让效果跟申请某个非0大小的空间一样,所不同的是返回的指针不可以被用来访问一个对象。
为什么 new T[0] 和 malloc(0) 不返回空指针
首先需要说明的是,按照C++标准,成功的 new T[0] 是不能返回空指针的。而 malloc(0),C 语言标准则指出,成功的时候可以返回空指针,也可以返回非空指针,多数库一般也选择了返回非空指针这种行为。
为什么这么做呢?
1. 理念:0大小的对象也是对象。
2. 实践:返回空会和分配失败混淆,尤其是大小是计算出来的时候,这时如果得到的是空指针,用户程序会误以为分配失败了。
3. 实现:反正返回的地址不能读写,此时可以返回同一个固定的地址,并没什么额外开销。而且多数编译器,C和C++一起提供,C++库的new也用C库的malloc实现,使二者保持一致也比较省事。
4.不管返回的是不是空,都可以free的。
测试程序如下
#include <stdlib.h>
#include <stdio.h>
int main(int argc, char *argv[])
{
char *ptr;
printf("0x%x/n", ptr); // this line will cause seg fault sometimes
printf("----malloc 0 4 times----/n");
ptr = (char *)malloc(0);
printf("0x%x/n", ptr);
ptr = (char *)malloc(0);
printf("0x%x/n", ptr);
ptr = (char *)malloc(0);
printf("0x%x/n", ptr);
ptr = (char *)malloc(0);
printf("0x%x/n", ptr);
printf("----malloc 1 4 times----/n");
ptr = (char *)malloc(1);
printf("0x%x/n", ptr);
ptr = (char *)malloc(1);
printf("0x%x/n", ptr);
ptr = (char *)malloc(1);
printf("0x%x/n", ptr);
ptr = (char *)malloc(1);
printf("0x%x/n", ptr);
printf("----malloc 4 4 times----/n");
ptr = (char *)malloc(4);
printf("0x%x/n", ptr);
ptr = (char *)malloc(4);
printf("0x%x/n", ptr);
ptr = (char *)malloc(4);
printf("0x%x/n", ptr);
ptr = (char *)malloc(4);
printf("0x%x/n", ptr);
printf("----malloc 16 4 times----/n");
ptr = (char *)malloc(16);
printf("0x%x/n", ptr);
ptr = (char *)malloc(16);
printf("0x%x/n", ptr);
ptr = (char *)malloc(16);
printf("0x%x/n", ptr);
ptr = (char *)malloc(16);
printf("0x%x/n", ptr);
printf("----malloc 32 4 times----/n");
ptr = (char *)malloc(32);
printf("0x%x/n", ptr);
ptr = (char *)malloc(32);
printf("0x%x/n", ptr);
ptr = (char *)malloc(32);
printf("0x%x/n", ptr);
ptr = (char *)malloc(32);
printf("0x%x/n", ptr);
printf("----malloc 64 4 times----/n");
ptr = (char *)malloc(64);
printf("0x%x/n", ptr);
ptr = (char *)malloc(64);
printf("0x%x/n", ptr);
ptr = (char *)malloc(64);
printf("0x%x/n", ptr);
ptr = (char *)malloc(64);
printf("0x%x/n", ptr);
return 0;
}
系统表现如下:
root@dell:~/test# ./a.out .
0xd27fb840
----malloc 0 4 times----
0x8060f38
0x8060f48
0x8060f58
0x8060f68 diff=0x10=16B
----malloc 1 4 times----
0x8060f78
0x8060f88
0x8060f98
0x8060fa8 diff=0x10=16B
----malloc 4 4 times----
0x8060fb8
0x8060fc8
0x8060fd8
0x8060fe8 diff=0x10=16B
----malloc 16 4 times----
0x8061340
0x8061358
0x8061370
0x8061388 diff=0x18=24B
----malloc 32 4 times----
0x8061948
0x8061970
0x8061998
0x80619c0 diff=0x28=40B
----malloc 64 4 times----
0x8062348
0x8062390
0x80623d8
0x8062420 diff=0x48=72B
第一个是0xdxxx是因为指针变量在建栈的时候已经在栈上获得4B的一个空间,而空间里面的值,应该是随机的
不过不晓得为什么总指在同一个地方?
malloc在ics(introduction to computer science)中讲过,除了分出来的空间之外,为了维护整个堆结构,并考虑时间,空间效果
其或头,或尾,或头尾,均有额外的指针结构存在
分析16,32,64B的情况可知,多余的部分为8B,猜测是头尾各4B
然后再看,0,1,4的时候都是16B,说明每次分配的时候有个最小下限
也就是起板就是8B作为分出来的数据,另外8B作为额外的指针什么的
原讨论链接:http://community.csdn.net/expert/topicview1.asp?id=4351400
所属论坛:C语言 审核组:C/C++
提问者:jidahyx 解决者:steedhorse
感谢:steedhorse
关键字:
答案:
char *p = (char *)malloc(0);
strcpy(p, "hello");
printf("%s/n",p);
free(p);
其中,p中的地址是堆内的首地址?
---------------------------------------------------------------
C99标准(ISO/IEC 9899:1999 (E))上说:
If the size of the space requested is zero, the behavior is implementationdefined:
either a null pointer is returned, or the behavior is as if the size were some
nonzero value, except that the returned pointer shall not be used to access an object.
如果所请求的空间大小为0,其行为由库的实现者定义:可以返回空指针,也可以让效果跟申请某个非0大小的空间一样,所不同的是返回的指针不可以被用来访问一个对象。
为什么 new T[0] 和 malloc(0) 不返回空指针
首先需要说明的是,按照C++标准,成功的 new T[0] 是不能返回空指针的。而 malloc(0),C 语言标准则指出,成功的时候可以返回空指针,也可以返回非空指针,多数库一般也选择了返回非空指针这种行为。
为什么这么做呢?
1. 理念:0大小的对象也是对象。
2. 实践:返回空会和分配失败混淆,尤其是大小是计算出来的时候,这时如果得到的是空指针,用户程序会误以为分配失败了。
3. 实现:反正返回的地址不能读写,此时可以返回同一个固定的地址,并没什么额外开销。而且多数编译器,C和C++一起提供,C++库的new也用C库的malloc实现,使二者保持一致也比较省事。
4.不管返回的是不是空,都可以free的。
测试程序如下
#include <stdlib.h>
#include <stdio.h>
int main(int argc, char *argv[])
{
char *ptr;
printf("0x%x/n", ptr); // this line will cause seg fault sometimes
printf("----malloc 0 4 times----/n");
ptr = (char *)malloc(0);
printf("0x%x/n", ptr);
ptr = (char *)malloc(0);
printf("0x%x/n", ptr);
ptr = (char *)malloc(0);
printf("0x%x/n", ptr);
ptr = (char *)malloc(0);
printf("0x%x/n", ptr);
printf("----malloc 1 4 times----/n");
ptr = (char *)malloc(1);
printf("0x%x/n", ptr);
ptr = (char *)malloc(1);
printf("0x%x/n", ptr);
ptr = (char *)malloc(1);
printf("0x%x/n", ptr);
ptr = (char *)malloc(1);
printf("0x%x/n", ptr);
printf("----malloc 4 4 times----/n");
ptr = (char *)malloc(4);
printf("0x%x/n", ptr);
ptr = (char *)malloc(4);
printf("0x%x/n", ptr);
ptr = (char *)malloc(4);
printf("0x%x/n", ptr);
ptr = (char *)malloc(4);
printf("0x%x/n", ptr);
printf("----malloc 16 4 times----/n");
ptr = (char *)malloc(16);
printf("0x%x/n", ptr);
ptr = (char *)malloc(16);
printf("0x%x/n", ptr);
ptr = (char *)malloc(16);
printf("0x%x/n", ptr);
ptr = (char *)malloc(16);
printf("0x%x/n", ptr);
printf("----malloc 32 4 times----/n");
ptr = (char *)malloc(32);
printf("0x%x/n", ptr);
ptr = (char *)malloc(32);
printf("0x%x/n", ptr);
ptr = (char *)malloc(32);
printf("0x%x/n", ptr);
ptr = (char *)malloc(32);
printf("0x%x/n", ptr);
printf("----malloc 64 4 times----/n");
ptr = (char *)malloc(64);
printf("0x%x/n", ptr);
ptr = (char *)malloc(64);
printf("0x%x/n", ptr);
ptr = (char *)malloc(64);
printf("0x%x/n", ptr);
ptr = (char *)malloc(64);
printf("0x%x/n", ptr);
return 0;
}
系统表现如下:
root@dell:~/test# ./a.out .
0xd27fb840
----malloc 0 4 times----
0x8060f38
0x8060f48
0x8060f58
0x8060f68 diff=0x10=16B
----malloc 1 4 times----
0x8060f78
0x8060f88
0x8060f98
0x8060fa8 diff=0x10=16B
----malloc 4 4 times----
0x8060fb8
0x8060fc8
0x8060fd8
0x8060fe8 diff=0x10=16B
----malloc 16 4 times----
0x8061340
0x8061358
0x8061370
0x8061388 diff=0x18=24B
----malloc 32 4 times----
0x8061948
0x8061970
0x8061998
0x80619c0 diff=0x28=40B
----malloc 64 4 times----
0x8062348
0x8062390
0x80623d8
0x8062420 diff=0x48=72B
第一个是0xdxxx是因为指针变量在建栈的时候已经在栈上获得4B的一个空间,而空间里面的值,应该是随机的
不过不晓得为什么总指在同一个地方?
malloc在ics(introduction to computer science)中讲过,除了分出来的空间之外,为了维护整个堆结构,并考虑时间,空间效果
其或头,或尾,或头尾,均有额外的指针结构存在
分析16,32,64B的情况可知,多余的部分为8B,猜测是头尾各4B
然后再看,0,1,4的时候都是16B,说明每次分配的时候有个最小下限
也就是起板就是8B作为分出来的数据,另外8B作为额外的指针什么的
相关文章推荐
- malloc(0)返回什么地址?
- malloc(0)返回什么地址?
- malloc(0)返回什么地址?
- malloc(0)返回什么地址?
- malloc(0)返回什么地址?
- malloc(0)返回什么
- 编写支持对其分配的malloc和free函数,分配内存时,malloc函数返回的地址必须能被2的n次方整除
- C语言学习9: malloc动态内存存储,动态内存分配去空格字符增长版,动态内存分配去符号incr增长版,型参和返回值都是int型的函数的指针,main函数的地址也可以用指针指向,typedef定义函数指针,函数定义与嵌套的作用,返回函数指针类型,const作用
- malloc(0)返回什么
- malloc(0)返回的是什么
- C语言学习7 :二级指针定义,强制转换,多级指针初步,6级指针构造,错误应用*p=&a,错误应用 二级p2,void型指针的兼容性,malloc函数基本用法,malloc分配空间和堆栈空间的区别,验证malloc函数内存的分配,验证malloc函数的越界,内存泄漏,指针不能返回局部变量地址,内存分配
- 【转】netstat 命令当中的内部地址和外部地址分别代表的是什么?
- 实现char * my_strcat(char * dest,char *src)函数. 返回: dest字符串的地址。 功能:将src指向的字符串追加到dest指向字符串的后面
- [JavaScript] typeof 返回什么值?
- 通过Http地址返回JSON数据,进行解析;通过ftp返回.txt文件数据,进行解析;
- C#返回绝对URL地址
- java上传图片到阿里云oss云存储中,返回url链接地址
- java 根据地址返回经纬度
- Retrofit打印请求地址和返回内容
- accept 返回不了对端地址