int a = 10;
int *p = new int[0];
p = &a;
cout << *p << endl;
在c ++中,如果将内存大小分配为零会发生什么?
分配后,我得到有效的内存指针,并输出有效的数字。
但我认为new运算符应返回类似FAILD或NULL的内容。
有人可以解释一下细节吗?
答案 0 :(得分:3)
分配后,我得到有效的内存指针,并输出有效的数字。
您提供的代码实际上并未对此进行测试。
执行p = &a
时,您重新分配 p
指向某个完全不同的。无论以前做什么与继续执行该计划无关。
答案 1 :(得分:1)
在“a”的块上指定指针“p”,因此在打印时p不再指向零大小的块。
答案 2 :(得分:1)
来自ISO / IEC 14882:2003(E),5.3.4.6
direct-new-declarator中的每个常量表达式都应该是一个整型常量表达式(5.19)并计算为严格正值。直接新声明者中的表达式应具有非负值的积分或枚举类型(3.9.1)。 [例如:如果n是int类型的变量,那么new float [n] [5]格式正确(因为n是direct-new-declarator的表达式),但new float [5] [n]是形式错误(因为n不是常数表达式)。如果n为负数,则新浮点数[n] [5]的效果未定义。]
他们很聪明。可以将零视为non-negative value
吗?可能是的,因为它编译没有任何问题,我想。
答案 3 :(得分:1)
来自ISO / IEC 14882:2003(E),5.3.4.7
当表达式的值在 一个直接新的声明者是零, 调用分配函数 分配一个没有元素的数组。
所以你得到一个有效的指针,但你不能取消引用它,并且仍然必须删除[]它。
答案 4 :(得分:1)
在c ++中,如果将内存大小分配为零会发生什么?
零大小的数组有效 您可以取消引用任何成员。
这就是为什么希腊人花了这么长时间辩论它将零视为一个数字。但我们可以感谢印度的伟大思想,最终将0作为数字0归零。它们永远占据了它们并且我们不高兴他们这样做了,如果没有这样一个独特的价值,很多现代数学都是不可能的。
分配后我得到有效的内存指针
这是正确的。
如果失败则会抛出异常。
并打印有效数字。
您的作业:p = &a;
可能不是您想要的。因为这只是泄漏内存并将p设置为指向变量a。你可能想要做的是:
(*p) = a;
// or
p[0] = a;
这是未定义的行为。
正如您在数组结束后分配值一样。
但我认为new运算符应返回类似FAILD或NULL的内容。
没有
有人可以解释一下细节吗?
是