指向 C99 之前由运行时确定大小的数组的指针
Pointer to array of runtime-determined size pre-C99
在 C99 之前,C 标准是否允许定义或强制转换为指向 长度数组的指针?
我知道标准在 C99 之前不允许可变长度数组,但是是否允许指向运行时确定大小的数组的指针对我来说并不明显,因为编译器知道为指针分配多少内存在编译时,不像数组。
gcc 10.1.0 允许它,即使使用 -std=c90
,但我很好奇标准是否允许它,而不是特定编译器是否允许。 很像,但是答案不讲标准
这是一个代码示例:
#include <stdio.h>
int f() {
int a;
scanf("%d", &a)
return a;
}
int main() {
int dim1 = f();
int dim2 = 2*dim1;
int (*p)[dim1][dim2]; // is this allowed pre-C99?
return 0;
}
这违反了约束条件。符合标准的 C89 编译器必须为此程序发出诊断。
3.5.4.2 Array declarators
Constraints
The expression that specifies the size of an array shall be an integral constant expression that has a value greater than zero.
使用 gcc 使用 -std=c90 -pedantic
获得(大部分)符合模式。
在 C99 之前,C 标准是否允许定义或强制转换为指向 长度数组的指针?
我知道标准在 C99 之前不允许可变长度数组,但是是否允许指向运行时确定大小的数组的指针对我来说并不明显,因为编译器知道为指针分配多少内存在编译时,不像数组。
gcc 10.1.0 允许它,即使使用 -std=c90
,但我很好奇标准是否允许它,而不是特定编译器是否允许。
这是一个代码示例:
#include <stdio.h>
int f() {
int a;
scanf("%d", &a)
return a;
}
int main() {
int dim1 = f();
int dim2 = 2*dim1;
int (*p)[dim1][dim2]; // is this allowed pre-C99?
return 0;
}
这违反了约束条件。符合标准的 C89 编译器必须为此程序发出诊断。
3.5.4.2 Array declarators
Constraints
The expression that specifies the size of an array shall be an integral constant expression that has a value greater than zero.
使用 gcc 使用 -std=c90 -pedantic
获得(大部分)符合模式。