gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 23:32:24 26 4
gpt4 key购买 nike

我们知道,我们可以使用 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;
}

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

最佳答案

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

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

关于c - 在 c 中工作的运行时数据类型,sizeof 是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12636774/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com