【发布时间】:2023-03-24 01:25:01
【问题描述】:
C 代码是这样的:
#include <stdio.h>
#include <unistd.h>
#define DIM(a) (sizeof(a)/sizeof(a[0]))
struct obj
{
int a[1];
};
int main()
{
struct obj *p = NULL;
printf("%d\n",DIM(p->a));
return 0;
}
这个对象指针p 是NULL,所以,我认为这个p->a 是非法的。
但是我在Ubuntu14.04中测试过这段代码,它可以正确执行。所以,我想知道为什么......
注意:原始代码上面有int a[0],但我已将其更改为int a[1],因为每个人似乎都被这个问题而不是实际问题所困扰,即:
当p 等于NULL 时,表达式sizeof(p->a) 是否有效?
【问题讨论】:
-
不是这里发生的事情,但不要假设“非法”的事情(未定义的行为)似乎不起作用。事实上,在编译器版本升级这样简单的事情破坏它们之前,它们似乎可以工作很长时间。
-
Chris Beck 是绝对正确的:你的
#define DIM()宏是编译时间。这里只有 type 很重要:而不是实际的运行时值。 -
@paxdiablo 现在是 2015 年,是时候停止将 C++ 视为 C 的超集了吗?
-
@paxdiablo 除了
int a[0];在两种语言中都无效之外,所有这些代码都是有效的 C++。 OP 可能正在使用 C++ 编译器,我们不知道 -
@this: OMG,太搞笑了 :-) 这个问题实际上与零长度数组无关,尽管我承认考虑到 cmets 中发生的侧向跟踪,它看起来可能是这样。问题只是与
sizeof(p->a)在p == NULL时是否有效有关。事实上,考虑到造成的混乱,我想我会去编辑那个零。
标签: c