char * a = new char[8]分配几个字节的空间?我有两个你绝对想不到的答案!

acneyouth 2004-08-11 04:36:41
正常情况下当然是8个字节了,但是,

如果你在project\option中选择code gard,同时勾选其下的4个选项,另外去掉build width runtime packages和use dinamic RTL选项,你将得到9个字节;

如果你将上述所有选项都勾选上,你将得到11个字节!

这是不是个bug?害我耽误了两天时间,掉了几百根头发!
...全文
1256 40 打赏 收藏 转发到动态 举报
写回复
用AI写文章
40 条回复
切换为时间正序
请发表友善的回复…
发表回复
acneyouth 2004-08-12
  • 打赏
  • 举报
回复
看来是我写程序不严谨,又受了inspect的误导,接受大家的教育!
老实说,我没扎实学过C,一直是在实践中自学来的。有时候写错了,但碰巧没报错,就当成定式记下来了,这才会有这样的错误。

这个问题的起因是我定义了这样的宏:
#define MacroNew(a,len) char * a = new char[len+1] ;memset(a,0,len+1) ;
但在使用中发现调用宏时,程序会失去响应,于是一步一步产生这样的疑惑。

这个宏为什么导致问题现在我也没想通,不过先结贴了,不然要打起来。
pcyy 2004-08-12
  • 打赏
  • 举报
回复
:) 凑个热闹
kpzh 2004-08-12
  • 打赏
  • 举报
回复
虽然结贴了

可是我还有点想法

我觉得是分配了10个字节

理由:char的8个字节+指针a的2个字节=10个字节
BCB 2004-08-11
  • 打赏
  • 举报
回复
:) 凑个热闹
myy 2004-08-11
  • 打赏
  • 举报
回复
BCB 老大啊,难得一见,难得一见...
BCB 2004-08-11
  • 打赏
  • 举报
回复
主要问题是:C跟PASCAL或DELPHI不一样,
不进行数组的越界检查,好处是灵活,效率高,
后者,随时都要检查操作数组是否越界。
BCB 2004-08-11
  • 打赏
  • 举报
回复
如此简单的问题,还掉了一把头发,
楼主钻进牛角尖。
kmfangxun 2004-08-11
  • 打赏
  • 举报
回复
To: Big_foolcat

我不想吵架,不过你动不动就用

----------------------------
唉~~~~这都是些什么人呀
让无知的人继续无知下去吧。
-----------------------------

这类言语讲话,实在让人受不了,即使你很牛B,也没必要,对吧!


TO:ALL

不好意思,SORRY!






zihan 2004-08-11
  • 打赏
  • 举报
回复
我们都是搞程序的,文明人嘛,别说胀话就好了.

别为了争问题伤了和气哦.....
myy 2004-08-11
  • 打赏
  • 举报
回复
不同意 kmfangxun() ,

“存放NULL的最后一位”也是属于 new 的大小之内的,new 多少就是多少,
你非要越界程序可能不会报错,但肯定是不对的。

一般,打算存放 Length 长度的字符串(不含结尾'\0'),
应该 new char[Length+1],最后一位手工赋为'\0' 。
kmfangxun 2004-08-11
  • 打赏
  • 举报
回复
To: Big_foolcat

看你那出言不狲的吊样,操你妈!
kmfangxun 2004-08-11
  • 打赏
  • 举报
回复

让无知的人继续无知下去吧。
=========================

既然你这样说,我也就不客气了,你懂多少?sb,nmb!
Big_foolcat 2004-08-11
  • 打赏
  • 举报
回复

  让无知的人继续无知下去吧。
kmfangxun 2004-08-11
  • 打赏
  • 举报
回复
To: Big_foolcat

谁让你那么用的:

char * a = new char [1];
a[0] = 'a';
a[1] = '\0'; // 最后一位是用来存放NULL的,怎么是误导别人?
delete [] a;




Big_foolcat 2004-08-11
  • 打赏
  • 举报
回复
To: kmfangxun

char * a = new char [1];
a[0] = 'a';
a[1] = 'b'; // 你没发现这已经越界了吗?不要训导群众好不好
delete [] a;
kmfangxun 2004-08-11
  • 打赏
  • 举报
回复

唉~~~~这都是些什么人呀
========================

 喂,别这样说好吧,你说我是什么人?

   char * a = new char [1]; 就是分配了2Byte,怎么了?
Big_foolcat 2004-08-11
  • 打赏
  • 举报
回复
To: kmfangxun

按你这么说 char * a = new char [1]; //分配了2Byte???

唉~~~~这都是些什么人呀
kmfangxun 2004-08-11
  • 打赏
  • 举报
回复


我始终认为 char * a = new char[8]申请了9个字节(0-8).
geochway 2004-08-11
  • 打赏
  • 举报
回复
建议看看WINDOWS有关内存管理的资料,你就会明白了.
geochway 2004-08-11
  • 打赏
  • 举报
回复
(1)楼主的问题本身就是个问题,系统到底给你分配了多少空间,
事实上只有操作系统知道,应用程序本身并不知道,这本身
就是操作系统分配内存的原则,不会少分给你,可能会多分
给你,但你不能用,你不能去冒这个风险. 不知9,11是怎么出来的?
(2)事实上,操作系统在分配内存时,它有它的规则,至少在WIN32
系统中,它分配的指针会对齐在4字节上,假设你中申请分配1个字节,
事实上你至少可以得到4个字节的空间,因为后面3个字节空间事实上
它已经同时分配给你了.


加载更多回复(20)

13,822

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧