正如我们所知,我们可以使用int (*p)[10]
来定义一个指向 int[10] 数组的指针,所以如果我们有p=0
and sizeof(int)==4
, p+1
will be 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;
}
我希望我不是在问一个愚蠢的问题,也不是在犯愚蠢的错误......