社区
C++ 语言
帖子详情
关于动态内存的怪异问题
zhangjgbupt
2007-08-01 10:17:09
char* ptr;
if((ptr=(char*)malloc(0))==NULL)
put("get a null pointer");
else
puts("get a valid pointer");
我的测试结果是: 尽管把0传给,但是ptr仍然是有地址的,不知道怎么解释??
...全文
316
13
打赏
收藏
关于动态内存的怪异问题
char* ptr; if((ptr=(char*)malloc(0))==NULL) put("get a null pointer"); else puts("get a valid pointer"); 我的测试结果是: 尽管把0传给,但是ptr仍然是有地址的,不知道怎么解释??
复制链接
扫一扫
分享
举报
写回复
配置赞助广告
用AI写文章
13 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
milefo
2007-08-03
打赏
举报
回复
在操作系统中,很多内存操作都是按块进行的。当然可以有不同的块大小。
这种malloc(x)之类的内存申请,实际是想得到一块不小于其要求的x bytes的空间。
想想,如果让你自己去设计,你会怎样做呢?
我想也不会那么任意的。
taodm
2007-08-03
打赏
举报
回复
4还是小的呢。你申请n一般要按8字节取整,以确保对齐问题,还要额外保留cookie字段。。。
申请了n你就只能当n用,讨论它实际分配了多少是一个没实用价值的行为。
星羽
2007-08-03
打赏
举报
回复
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大小的空间一样,所不同的是返回的指针不可以被用来访问一个对象。
lockhall
2007-08-03
打赏
举报
回复
不過我在VS2005下,好象還是4個字節啊。。。
就是malloc(0);
逸学堂
2007-08-03
打赏
举报
回复
修正上面的if
if (size == 0) // 在这里进行特殊处理
逸学堂
2007-08-03
打赏
举报
回复
malloc(0)
malloc 0其实是已经写到C标准中去了,对于0要特殊处理.
如同new 0一样.一般都是申请一个字节,用于标注申请到的空间.
常见的
void* operator new(size_t size)
{
if (size == 0; // 在这里进行特殊处理
size = 1;
return operator::new(size);
}
Y神圣
2007-08-03
打赏
举报
回复
个人觉得malloc是将0解释为一个长度,int的长度,达人测试一下?
fish6344
2007-08-02
打赏
举报
回复
这是C语言对内存操作malloc的规定:malloc函数只有在内存申请失败的唯一条件成立时才可以返回NULL!在size为0的情况下至少要返回1个char(1byte),以表示malloc操作是一次成功的内存占有。
lockhall
2007-08-02
打赏
举报
回复
這個要mark下。
對于申請0空間明天仔細研究下。
:)
hearmin
2007-08-02
打赏
举报
回复
你如何测试你申请内存的大小,这点很奇怪,不要告诉我你用sizeof。
只要得到的指针指向的内存区域可写,那么当然可以向该指针指向的地方写入数据,只是写入的地方可能是“他人的领地”。
zhangjgbupt
2007-08-02
打赏
举报
回复
但是测试的结果是: 所申请的内存是大小是0,而不是1,而且可以向里存储数据,很奇怪
gfxiang
2007-08-01
打赏
举报
回复
you can google it with key words "malloc 0".
yydrewdrew
2007-08-01
打赏
举报
回复
http://community.csdn.net/Expert/topic/5681/5681586.xml?temp=.5015222
C++中的指针初始化
C++中定义一个指针的时候,例如 int *p。 可以认为定义了两个内容,1:指针,2:指针的指向。需要对指针本身和指针的指向都进行初始化,既要初始化内存地址,也要定义内存中的内容。如果不进行指针的初始化,则内存地址随机分配。格根据编译器的不同,会出现警告或者报错不同等级的
问题
,在编译中也可能出现难以察觉的bug。 指针的初始化时等号左右两端都必须是内存地址。例如 int a; int ...
总结:三种传递动态分配内存的方法
文章出处:http://blog.chinaunix.net/space.php?uid=10167808&do=blog&id=25911 在项目中,遇到到需要专门做一个函数来实现
动态内存
的分配,然后其他的函数都可以使用这块内存进行读写。但是比较
怪异
的是,在其他函数中对该块内存的标识是通过一个unsigned long的变量,而并非通过一个指针指向该块内存。思索良久,发现它的
动态内存
的传递可能
C/C++
动态内存
管理:从原理剖析到工具排查与性能优化
内存管理是C/C++开发者的核心基本功,
动态内存
分配虽机制简单,却与对象生命周期、所有权、并发和性能深度耦合,一旦失衡便可能引发偶发崩溃、内存泄漏或性能劣化。理解堆与栈的本质差异,掌握malloc/free背后的分配器运作原理,是定位
问题
的前提。面对常见的内存泄漏、悬垂指针和缓冲区越界,Valgrind与AddressSanitizer提供了从动态插桩到编译期检查的高效排查路径。现代C++通过RAII与智能指针从设计层面规避风险,而对象池、批量分配及分配器选型则能显著优化高频路径性能。本文基于实战经验,系统
C中二维数组作为参数的几种做法
总有机会需要这样使用。怎么办呢? char** char** argv = (char**)malloc(sizeof(char*)*ARGC); for (int i=0; i<ARGC; i++) { argv[i] = (char*)malloc(PARAM_SIZE); memset(argv[i], 0, PARAM_SIZE); } 个人推荐这个办法。最直观,使用最方便。 定义一个结构 在结构中放不同数据。对
java变量数组长度_C语言中的变量长度数组
有的书上是这样写的:#include int main (void){int test;printf ("OK/n");scanf ("%i",&test);unsigned long long int aa[test];printf ("aa[test]=%i/n",aa[test]);retrun 0;}我按照书上说的那样声明可变长度的数组,为什么不能编译呢?书上的格式是这样的:uns...
C++ 语言
65,213
社区成员
250,514
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章