问题标签 [variable-length-array]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
4120 浏览

c - 将可变长度数组初始化为零

当我这样做时,它创造了一些非常疯狂的价值。我听说过尝试使用 malloc 或 memset,但值没有改变。我要做的就是将所有这些设置为零,以便我可以将其用作计数器。谢谢!

0 投票
1 回答
6095 浏览

c - 长度为 0 的可变长度数组?

在 C 中,通常不允许数组的大小为 0(除非我使用一个或其他编译器端扩展)。

OTOH,有些 VLA 的长度可能会变成 0。

他们被允许吗?

我说的是以下代码:

结果是一个data长度为 0、2、4 或 6 的数组,具体取决于标志的组合。

现在的问题是:对于数组长度为 0 的情况,此代码是否有效?

0 投票
3 回答
5765 浏览

c - C中动态分配的结构数组

我只是想知道以下是否有效。我有一个名为的结构foo,其定义如下:

在运行时,我需要创建一个由上述结构组成的数组,其大小取决于我从文件输入中接收到的值。假设这个尺寸是k. 下面的代码会适当地分配一个动态大小的结构数组吗?

编辑:如果我想访问这些数组中结构的成员,我会使用格式fooarray[someindex].member吗?

0 投票
1 回答
641 浏览

c - 断言可变长度数组的分配

我为可能的重复道歉(无法找到答案):

我们是否需要确保变长数组的分配已经成功完成?

例如:

答案似乎很明显yes,但语法arr == NULL感觉有点不寻常。

谢谢


更新:

我承认我还不确定上面的代码是否可以编译(假设可以编译)。

如果它不编译,则意味着没有办法断言可变长度数组的分配。

因此,我假设如果分配失败,那么程序会立即崩溃。

这将是一个非常尴尬的情况,因为程序在非法内存访问(读取或写入)后崩溃是有意义的,但在内存分配不成功后崩溃是有意义的。

或者,分配可能不会导致任何事情,但是一旦我在“落入”堆栈之外的条目访问数组,我可能会遇到内存访问冲突(如堆栈溢出)......?

老实说,如果 VLA 后面有更多的局部变量(特别是其他 VLA),我什至看不到 VLA 是如何在堆栈上分配的,所以我也希望能得到关于这个问题的答案。

0 投票
2 回答
202 浏览

c - 编译器如何解析变长数组后声明的变量地址?

假设我有以下函数,它使用可变长度数组:

编译器如何确定的地址var2

我能想到的唯一方法是放在andarr之后。var1var2

但是在那种情况下,如果有几个变长数组呢?

将它们全部放在“正常”变量之后只会有助于解析第一个变量的地址。

我在这里的隐含假设是所有局部变量(包括 VLA)都分配在堆栈上。

我意识到它不是由 C99 标准定义的,所以问题本质上是关于编译的。

0 投票
1 回答
151 浏览

c++ - 动态和静态内存分配?

代码不能编译,因为程序将尝试为堆栈上的数组分配未知内存,但它编译!我知道什么是动态内存,我已经阅读了很多关于此的内容,但我不明白,为什么上面的程序会运行?!不应该是这样吗?:

有人可以给我一个例子,其中不适用于静态分配而仅适用于动态分配?

0 投票
1 回答
106 浏览

c++ - 具有动态大小的静态字符数组

我正在创建大小在运行时定义的静态字符数组。而且我没有收到编译错误。
这怎么可能?
这是我的例子:

0 投票
0 回答
73 浏览

c++ - C ++使用常量变量初始化数组大小

我注意到 G++ 编译器确实允许像这样初始化一个数组:

数组 subPalins 的大小是 len,是一个常量变量。我记得不允许初始化可变大小的数组,因为数组的大小必须在编译时确定。虽然这里的 len 是一个常数,但它仍然是一个变量,我不明白为什么允许这样做。

0 投票
2 回答
1108 浏览

c - 没有malloc的完全封装

我正在试验 C11 和 VLA,试图在堆栈上声明一个结构变量,但声明不完整。目标是提供一种机制来创建某种结构类型的变量而不显示内部结构(如 PIMPL 习惯用法),但无需在堆上创建变量并返回指向它的指针。此外,如果结构布局发生变化,我不想重新编译每个使用该结构的文件。

我设法编写了以下内容:

私人.h:

公共.h:

实施.c:

主.c:

我已经测试了这段代码,它似乎可以工作。但是我不确定我是否忽略了一些可能危险或不可移植或可能损害性能的东西(如混叠、对齐或类似的东西)。另外我想知道C中是否有更好的(便携式)解决方案来解决这个问题。

0 投票
3 回答
189 浏览

c - 这两种方法中哪一种是为静态数组提供维度的正确方法?

这两种形式的数组声明是否正确?

第一的:

第二:

对我来说,这两种方法是完全有效的,但有人告诉我第一种是错误的。

第一个就像说:

所以,对我来说,说第一个无效并没有多大意义。

但为了完全确定,我想在这里问它。它只是关于编程风格还是第一个不是正确的方法?

谢谢你。