运行在c中的运行时数据类型,sizeof如何工作?

时间:2012-09-28 08:58:51

标签: c pointers runtime

如我们所知,我们可以使用int (*p)[10]来定义指向int [10]数组的指针,因此如果我们有p=0sizeof(int)==4p+1将是0+10*4 = 40,这是有效的,因为编译器在编译时知道p是什么。

然后如果我们这样做会怎么样:

int main()
{
    int sz = 10;
    int (*p)[sz];
}
换句话说,在程序运行之前,没有人会知道sz。我认为这应该不起作用,但确实有效..

所以我的问题是,它是如何工作的?我的意思是,有没有在运行时在c中存储值类型的地方?如果没有,这怎么可行?这只是编译器相关的吗?

我正在使用gcc version 4.4.5 (Ubuntu/Linaro 4.4.4-14ubuntu5),您可以使用以下代码对其进行测试。

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int main()
{
    int COL ;
    int ROW ;
    scanf("%d %d", &COL, &ROW);
    int (*p)[COL];
    int *mem = (int*)malloc(sizeof(int)*COL*ROW);
    memset(mem,0,sizeof(int)*COL*ROW);
    p = (int (*)[10])mem;

    printf("0x%p\n", p);
    printf("COL=%d\n", p+1, (((int)(p+1))-((int)p))/sizeof(int));

    mem[2*COL+0] = 1;
    printf("%d\n", p[2][0]);
    mem[2*COL+5] = 2;
    printf("%d\n", p[2][5]);
    mem[6*COL+7] = 3;
    printf("%d\n", p[6][7]);

    p[1][2] = 4;
    printf("%d\n", mem[1*COL+2]);

    free(p);

    return 0;
}

我希望我不是在问一个愚蠢的问题,也不是犯了愚蠢的错误......

1 个答案:

答案 0 :(得分:2)

可变长度数组类型的指针算法根据6.5.6:10定义良好,其示例代码与您的非常相似。根据6.5.3.4:2,当sizeof应用于可变长度数组时,将在运行时计算操作数以确定大小,因此可变长度数组指针算法同样进行。

自第二版(ISO / IEC 9899:1999修订版)以来,可变长度数组(6.7.6.2:4)已成为该标准的一部分;然而,它们是一个可选功能,符合实现不必支持(6.10.8.3)。