gpt4 book ai didi

c - 具有可变长度数组类型的 Sizeof 运算符

转载 作者:太空狗 更新时间:2023-10-29 16:37:10 25 4
gpt4 key购买 nike

根据 cppreference :

If the type of expression is a variable-length array type, expression is evaluated and the size of the array it evaluates to is calculated at run time.

意思是:如果expression的类型是VLA类型,那么expression会被求值。例如:

#include <stdio.h>

int main() {
int i = 0;
int a[i];
printf("%zu\n",sizeof(a[i++]));
printf("%d\n",i); // Here, print 0 instead of 1
return 0;
}

所以,根据引用资料,这里的i变成了1。但是,对于我的 GCC 编译器,i 打印为 0

参见 Wandbox Demo .

最佳答案

首先,请注意数组的大小不能为零,无论是否为 VLA。因此,您的代码会调用未定义的行为。

C11 6.7.6.2/5

"If the size is an expression that is not an integer constant expression:" /--/ "...each time it is evaluated it shall have a value greater than zero."


至于实际问题,a[i++]int类型,不是VLA类型。

为了获得副作用,必须涉及到 VLA 数组类型本身,例如 sizeof(a)。只有这样,操作数才会评估副作用。一个例子来说明这一点:

#include <stdio.h>

int main() {
int i=1, j=1;
int a[i][j];
int b[1][1];

(void) sizeof(a[--i]);
(void) sizeof(b[--j]);
printf("%d %d", i, j);

return 0;
}

这里 i 最终为 0,因为第一个 sizeof 由于 VLA 而被计算,但是 j 仍然为 1,因为 - -j 是常规数组的 sizeof 的一部分。

关于c - 具有可变长度数组类型的 Sizeof 运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48661057/

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