- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
C 标准有这样的语言:
6.5.3.4 The sizeof and _Alignof operators
Semantics
- The
sizeof
operator yields the size (in bytes) of its operand, which may be an expression or the parenthesized name of a type. The size is determined from the type of the operand. The result is an integer. If the type of the operand is a variable length array type, the operand is evaluated; otherwise, the operand is not evaluated and the result is an integer constant.
sizeof(char[foo()])
大小表达式必须在运行时计算才能计算大小,但标准的语言似乎没有涵盖这种情况(类型名称的类型是什么?)#include <stdio.h>
static int N = 0;
int foo(void) { return ++N; }
int main() {
typedef char S[foo()]; // foo() is called
printf("typedef char S[foo()];\t"); printf("N=%d\n", N);
printf("sizeof(S)=%d\t\t", (int)sizeof(S)); printf("N=%d\n", N);
typedef char U[foo()]; // foo() is called
printf("typedef char U[foo()];\t"); printf("N=%d\n", N);
printf("sizeof(U)=%d\t\t", (int)sizeof(U)); printf("N=%d\n", N);
S s1;
printf("S s1;\t\t\t"); printf("N=%d\n", N);
printf("sizeof(s1)=%d\t\t", (int)sizeof(s1)); printf("N=%d\n", N);
S s2;
printf("S s2;\t\t\t"); printf("N=%d\n", N);
printf("sizeof(s2)=%d\t\t", (int)sizeof(s2)); printf("N=%d\n", N);
U u1;
printf("U u1;\t\t\t"); printf("N=%d\n", N);
printf("sizeof(u1)=%d\t\t", (int)sizeof(u1)); printf("N=%d\n", N);
U *pu1 = &u1;
printf("U *pu1 = &u1;\t\t"); printf("N=%d\n", N);
printf("sizeof(*pu1)=%d\t\t", (int)sizeof(*pu1)); printf("N=%d\n", N);
U *pu2 = NULL;
printf("U *pu2 = NULL;\t\t"); printf("N=%d\n", N);
// sizeof(*pu2) does not evaluate *pu2, contrary to the Standard specification
printf("sizeof(*pu2)=%d\t\t", (int)sizeof(*pu2)); printf("N=%d\n", N);
char x2[foo()][foo()]; // foo() is called twice
printf("char x2[foo()][foo()];\t"); printf("N=%d\n", N);
printf("sizeof(x2)=%d\t\t", (int)sizeof(x2)); printf("N=%d\n", N);
printf("sizeof(x2[0])=%d\t\t", (int)sizeof(x2[0])); printf("N=%d\n", N);
// sizeof(char[foo()]) evaluates foo()
printf("sizeof(char[foo()])=%d\t", (int)sizeof(char[foo()])); printf("N=%d\n", N);
return 0;
}
输出(clang 和 gcc):
typedef char S[foo()]; N=1
sizeof(S)=1 N=1
typedef char U[foo()]; N=2
sizeof(U)=2 N=2
S s1; N=2
sizeof(s1)=1 N=2
S s2; N=2
sizeof(s2)=1 N=2
U u1; N=2
sizeof(u1)=2 N=2
U *pu1 = &u1; N=2
sizeof(*pu1)=2 N=2
U *pu2 = NULL; N=2
sizeof(*pu2)=2 N=2
char x2[foo()][foo()]; N=4
sizeof(x2)=12 N=4
sizeof(x2[0])=4 N=4
sizeof(char[foo()])=5 N=5
最佳答案
每个可变修改的类型都有一个大小,对于每个维度,要么是该维度的倍数,要么独立于它。没有理由评估可变修改对象的大小需要评估任何不会影响对象大小的维度的值,但一些编译器可能会评估这些维度的值,因为可变修改类型的原始规则暗示他们应该被评估。在不同实现以不同方式处理构造的情况下,标准的作者倾向于避免让标准建议任何一种行为更好。因此,标准对涉及可变修改类型的极端情况故意含糊不清,以避免将任何现有实现的行为描述为“错误”或低劣。
关于c - 何时以及如何在 sizeof 表达式中评估 VLA?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63021254/
在this post ,OP 包含有很多错误的代码,但是 1 行让我特别好奇,因为我无法查找任何东西,不允许它。这是具体的行: int n = 100000, arr[n]; 是否保证了声明和初始化的
我需要定义一个结构体,其中包含两个信号量和三个(至少)或更多数组作为大小为变量的结构体成员。指示性示例(不是正确的语法,而是给出上下文含义;lr 是 double 的 typedef): int
函数的参数可以在后面的参数中使用吗?这是不好的形式吗? void print(int n, int m, int matrix[n][m]) { for (int i=0; i
C11 允许像这样使用 VLA 数组(和矩阵) int row = 10; int col = 10; double matrix[row][col]; 但是如果我只想将矩阵的一行传递给一个函数,我可
我写了最简单的矩阵乘法代码来完成我对 C99 VLA 的理解。让我有点困惑的是,当我在函数定义的参数列表中声明一个指向 VLA 的指针时。 例如,在 fill_matrix_randomly 中,声明
这样的函数原型(prototype)在 C 中有效吗? int (*func())[*]; 如果是,我该如何定义这样的函数? 最佳答案 您应该返回一个指向不完整数组类型的指针,因为可变长度数组的 *
在 C 中,我相信以下程序是有效的:将指向已分配内存缓冲区的指针转换为数组,如下所示: #include #include #define ARRSIZE 4 int *getPointer(in
您可能知道,VLA's haves pros and cons 和它们在 C11 中是可选的。 我想使 VLA 成为可选项的主要原因是:“堆栈可能会爆炸”: int arr[n]; /* where
我了解什么是可变长度数组以及它们是如何实现的。这个问题是关于它们为什么存在。 我们知道 VLA 只允许在功能块(或原型(prototype))中使用,并且它们基本上不能在堆栈上的任何地方(假设正常实现
这是允许的吗? goto inside; { inside: int a[n]; } A goto statement shall not jump from outside the scope of
我注意到 C 编译器(gcc、clang、tinycc)允许我在没有警告的情况下将指向较大数组的指针分配给指向较小 VLA 的指针: #include #if !__TINYC__ void tak
我使用以下结构来使用隐写术对带有消息的 PPM 文件进行编码: typedef struct{ char code[CODE_LENGTH]; COMMENT *commentPPM;
进一步开发昨天的代码( seg fault caused by malloc and sscanf in a function ),我尝试在网上找到的一些教程的帮助下生成一个 2-dim vla。但我
我有以下无法编译的代码。 using namespace std; void f(int); template void array_ini_1d(T1 (&x)[N]) { for (int i
我在 SO 上阅读了有关 VLA 的不同答案,但找不到答案。就我而言,我有一个分配内存的函数: template void allocMemory(T *&data, const size_t num
这是一种定义矩阵类型的方法 typedef struct { int nr, nc; double *elem; } Matrix; 我想定义这个 typedef struct {
我试图了解 sizeof 运算符的工作原理,我遇到了 this问题。以下是该问题的代码 #include int main() { int i = 0; int a[i];
CERT's Secure Coding Standard包括一项 ( API05-C ),它鼓励使用一致的数组参数,这是我在很多代码中实现的建议(对于不支持它们的编译器,隐藏在 a macro 后面
(这是后续 to this question 。) 我试图了解将多维数组传递给 C 中的函数的“最佳实践”(或任何实际实践)是什么。当然这取决于应用程序,所以让我们考虑编写一个函数来打印二维数组可变大
我们已经知道,VLA (在 C99 中标准化)不是 C++ 标准的一部分。 所以下面的代码在 C++ 中是“非法的”: void foo(int n) { int vla[n]; for (i
我是一名优秀的程序员,十分优秀!