【发布时间】:2012-01-04 13:51:53
【问题描述】:
我知道在 C 中,数组不应该是动态调整大小的。
考虑到这一点,是否允许以下代码? (试图声明一个长度与双精度相同的字符数组。)
char bytes[sizeof(double)];
我的猜测是sizeof 在程序执行期间对其参数进行操作,因此这是不允许的,但我不确定。
另外,如果这是 C++ 而不是 C,会有区别吗?
【问题讨论】:
标签: c arrays memory-management sizeof
我知道在 C 中,数组不应该是动态调整大小的。
考虑到这一点,是否允许以下代码? (试图声明一个长度与双精度相同的字符数组。)
char bytes[sizeof(double)];
我的猜测是sizeof 在程序执行期间对其参数进行操作,因此这是不允许的,但我不确定。
另外,如果这是 C++ 而不是 C,会有区别吗?
【问题讨论】:
标签: c arrays memory-management sizeof
sizeof 表达式在编译时计算(由编译器而不是预处理器),因此该表达式是合法的。
在 C99 中有一个例外,允许动态数组。在这种情况下, sizeof 会根据上下文在运行时进行评估 (http://en.wikipedia.org/wiki/Sizeof)。它不会改变问题中表达的合法性。
【讨论】:
是的,这样做完全没问题。 sizeof() 的值是在编译时确定的。
【讨论】:
是的,它可以而且它甚至不会是动态大小的,因为sizeof(double) 是一个编译时常量。
【讨论】:
如果它的操作数不是VLA,你可以使用sizeof作为一个真正的常量。
#include <stdio.h>
#include <string.h>
int main(void) {
double x;
unsigned char dbl[sizeof x]; /* real constant */
/* make x's format have a 1 bit on the "correct" place */
x = 32.000000000000004;
memcpy(dbl, &x, sizeof x);
switch (dbl[0]) {
case sizeof *dbl: puts("1"); break; /* real constant */
case 0: puts("0"); break;
default: puts("other");
}
return 0;
}
在http://ideone.com/95bwM查看代码“正在运行”
【讨论】: