c - 具有空初始值设定项的空数组

标签 c sizeof variable-declaration

我该如何理解这一点:

void Func(double* P, long L) {}
int main(void) {
    double pert[] = {};
    Func(pert, sizeof(pert)/sizeof(pert[0]));
}

我的编译器提示:错误:使用 GNU 空初始值设定项扩展。 gcc和Clang可以正常编译和运行。该语法与 double pert[] 有何不同;或double *pert;

在这个例子中,pert甚至没有[0],那么pert[0]怎么有意义呢?是的,我想它与 sizeof(double) 相同。

特别是,我正在分析的代码在数组上使用了大量 sizeof,因此我不想将 [] 更改为 * 不必要的;

最佳答案

double pert[] = {};

是一种 catch-22 情况,数组应该至少有一个元素已定义大小,否则它将从初始值设定项列表终止,但您使用空初始值设定项列表,这在标准 C 和中不受支持来自 C++,它会将声明的数组成员初始化为 0。我认为,Gcc 会将其视为一个元素的数组。

表达式pert[anything]相当于*(pert + everything)。事实上你可以写0[pert]。只要 [] 的两个参数的和是一个可解引用的指针,那就是合法的代码(为此你会被代码审查小组钉死)。

为了澄清这一点,pert 不是指针,它是数组的名称,如果在需要指针的表达式中使用,则可以恶化为指向数组元素类型的指针。因此,如果将数组作为指针传递,您将丢失有关数组大小的信息,并且 sizeof 将不起作用

关于c - 具有空初始值设定项的空数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45353462/

相关文章:

c - 不编译确定 `sizeof float`

c - 什么是现代、可移植、安全的 memcpy 等价物,在 C 中进行编译时检查?

c - c中自己的结构错误

c - gdbserver 中缺少符号名称但 gdb 中没有

c - 指针的 scanf 函数不起作用(对于使用指针到指针的矩阵)

java - 类变量声明意外结束

mysql - 数据库连接 golang mysql

vb.net - 为什么 Option Explicit 仍然允许在 Visual Studio 中使用隐式 For 循环?

c - 调试错误 : DFS(Depth First Search) Graph, ADT

c - 如何访问字符数组的第一个字符?