C - 使用另一个参数作为其大小指定数组参数时会发生什么

在此处输入显示名称

我遇到了这段代码,但我真的不知道它是如何/为什么工作的:

void cistore(int bucketsize, int data[][bucketsize])
{
}

int main()
{
    return 0;
}

这里到底发生了什么?我希望 C 编译器(在本例中为 gcc)仅bucketsize在编译时可确定时才允许这样做但是即使在编译时无法知道bucketsize,gcc 也不会抱怨。gcc 是如何处理的?

约翰·博林格

这里到底发生了什么?

从 C99 开始,C 就支持变长数组,其长度是在运行时确定的。在 C99 中它是一个强制性特性,但从 C11 开始它成为一个可选特性。许多现代 C 编译器都支持它,微软的除外。

void cistore(int bucketsize, int data[][bucketsize])

,data被声明为指向bucketsize类型为 的元素数组的指针int指向的对象是一个变长数组,至少从函数的角度来看是这样。

我希望 C 编译器(在本例中为 gcc)仅bucketsize在编译时可确定时才允许这样做

惊喜!

但是即使在编译时无法知道bucketsize,gcc 也不会抱怨。gcc 是如何处理的?

如果指向的数组有明确的长度,GCC 将如何处理它?至于“怎么做”,我不认为GCC需要做太多的调整。

或者,如果您问的是语义,那么一旦他们克服了对 VLA 是一回事的任何震惊,它们就几乎是人们所期望的。指向的对象是一个数组,其任何给定函数调用的长度由bucketsize参数的值指定这可能因电话而异。

这是示例代码的扩展版本,用于演示:

void cistore(int bucketsize, int data[][bucketsize])
{
}

int main()
{
    int d1[5][5];
    int d2[4][6];
    int (*d3)[42] = NULL;

    cistore(5, d1);
    cistore(6, d2);
    cistore(42, d3);

    return 0;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

当 C 中的结构体中的 malloced 数据分配给另一个变量时会发生什么情况?

使用另一个QML对象作为参数从C ++调用QML函数

如何在将C ++宏作为参数传递给另一个宏之前对其进行扩展

在c++中使用一个函数的返回值作为另一个函数的参数

C ++:使用另一个类中的参数初始化对象数组

在C中使用错误的参数数量声明回调时会发生什么?

在svm.scv()中同时使用“ class_weight”和“ c”参数时会发生什么?

如果我在C / C ++中定义一个0大小的数组,会发生什么?

将类的方法作为参数传递给C ++中的另一个类

将指针类方法作为参数传递给另一个类方法C ++

C ++中带有另一个模板类作为参数的构造函数

C++,在另一个对象构造函数中将对象作为参数传递

对象的方法作为c ++中另一个类的方法参数

C# - 在另一个类中使用参数调用一个类

将指向一个C函数的指针作为另一个函数的参数传递

在模板函数C ++中的F &&,Args && ...参数之后添加另一个函数作为参数

具有可变数量和参数类型的C ++函数作为另一个函数的参数

Visual Studio解决方案(.sln)/ C#:使用另一个项目的dll作为参数启动一个项目

C ++将一个参数默认为另一个参数

C:是否可能有一个将函数指针数组作为其参数之一的递归函数?

我还有另一个简单的C ++顾虑,即以数组作为参数调用函数吗?我不断收到错误消息

C ++使用移动语义将参数传递给另一个函数

另一个使用引用和参数的函数中的C ++调用函数

使用单个整数数组访问另一个数组中的项目时会发生什么

直接在 C 中将函数的返回(和调用)作为另一个参数直接传递

将prop作为参数传递给另一个prop自定义属性c#

当我在C ++中存储指向按值传递参数的指针时会发生什么?

当我在C语言中省略函数的参数时会发生什么?

当我在 C# 中将 `ref` 值分配给 `out` 参数时会发生什么?