奇怪的gcc行为

有人报告了gcc一个奇怪的行为,这样的一段代码居然能够通过编译。

#include <cstdio>

#define NUM  getnum()
int getnum()
{
    int x = 0;
    scanf("%d", &x);
    printf("%d\n", x);
    return x;
}

int main()
{
    int array[NUM];
    printf("array size =%d\n",sizeof(array));
    return 0;
}

要命的是,编译之后居然还能运行。sizeof可以是运行期间确定的吗?

为了确定问题所在,我用-E选项对源代码进行预处理展开,对展开的代码再重新进行编译,居然还是通过了。这意味着问题根本不是由于那个宏引起的。于是,这样的代码也就通过了编译。

#include <cstdio>

int getnum()
{
    int x = 0;
    scanf("%d", &x);
    printf("%d\n", x);
    return x;
}

int main()
{
    int array[getnum()];
    printf("array size =%d\n",sizeof(array));
    return 0;
}

本来sizeof应该是编译期间常数,居然现在连运行期间常数都不是了。不知道gcc做了什么样的优化导致了这个问题。如果再把template参数掺和进来,岂不是会更有意思?


有地方说在C99以后,数组有两种定义:一种是大小是编译期间常数的,另外一种则不是。区别在于,前者分配在stack上,后者分配在heap上。并且在两者上执行sizeof也有不同的效果。

on August 13th, 2008 | No Comments »