问题标签 [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 投票
4 回答
5822 浏览

c - 变长数组的原型

我正在尝试编写一个函数,该函数在 c 中采用可变大小的数组。

它说对于可变长度数组,它需要在函数声明中限定。这意味着什么?我正在使用带有 LLVM 编译器 2.0 的 xcode 4.0。

谢谢您的帮助。

0 投票
1 回答
4548 浏览

c - 使用可变长度数组是否安全?

我担心可变长度数组。当我想动态分配一个数组时,如果无法分配足够的内存并且我可以在我的程序中正确响应,我会得到 null。使用可变长度数组我没有得到这个信息。我该怎么办?

0 投票
1 回答
1150 浏览

c - C 中不支持可变长度数组 C99

在 Visual Studio 2005 中,我正在尝试编译一个 .c 文件:

它不起作用,那么我的编译器遵循哪个标准?

0 投票
4 回答
18596 浏览

c++ - C++ 是否支持可变长度数组?

不,等等,忍耐一下……

VLA 一直是 GCC 扩展,但它们被 C99 采用:

[C99: 6.7.5.2/4]:如果大小不存在,则数组类型是不完整的类型。如果大小是*而不是表达式,则数组类型是未指定大小的变长数组类型,只能在具有函数原型范围的声明中使用;这样的数组仍然是完整的类型。如果大小是整数常量表达式,并且元素类型具有已知的常量大小, 则数组类型不是变长数组类型;否则,数组类型是可变长度数组类型。

C99 也称为ISO/IEC 9899:1999.

现在:

[C++11: 1.1/2]: C++是基于ISO/IEC 9899:1999(以下简称C标准)规定的C程序设计语言的通用程序设计语言。除了 C 提供的功能之外,C++ 还提供了额外的数据类型、类、模板、异常、命名空间、运算符重载、函数名重载、引用、自由存储管理运算符和其他库设施。

那么 C++11 不应该也有 VLA 吗?

0 投票
3 回答
339 浏览

c++ - gcc 对 VLA 的 sizeof 运算符评估是否不同?

g++允许可变长度数组 (VLA)作为扩展。sizeofVLA 上的operator的结果很有趣:

如果是sizeof(b),g++ 是否不遵循sizeof仅在编译时评估的标准?是否sizeof 超载

0 投票
6 回答
26783 浏览

c - ISO C90 禁止变长数组

我正在动态计算数组的大小。就像是:

但只是 GCC 编译器说:

搜索所以我找到了这个答案

C99 §6.7.5.2:

如果大小是一个不是整数常量表达式的表达式... ...每次对其进行评估时,它的值都应大于零。

所以,我重新声明了大小限制类型变量:

但它继续给我警告。这是 GCC 错误吗?

0 投票
4 回答
11732 浏览

c - 在 C 中将可变长度数组声明为全局变量

如何将可变长度数组声明为全局变量?

在扫描长度之前在函数中声明可变长度数组时,它会编译但不会运行。它给出了分段错误。当相同的声明语句移到扫描语句下方时,它运行良好。

如果我们想要一个对所有函数全局可用的可变长度数组,我们该怎么做呢?这里的问题是数组的长度只能通过某些函数来扫描。

0 投票
9 回答
42965 浏览

c - 数组类型和用 malloc 分配的数组的区别

今天我正在帮助我的一个朋友编写一些 C 代码,我发现了一些奇怪的行为,我无法向他解释为什么会发生这种情况。我们有一个包含整数列表的 TSV 文件,int每行都有一个。第一行是列表的行数。

我们还有一个带有非常简单的“readfile”的 ac 文件。第一行被读取到n,行数,然后有一个初始化:

最后是n带有 a的 for 循环fscanf

对于小 n (直到〜100.000),一切都很好。但是,我们发现当 n 很大 (10^6) 时,会发生段错误。

最后,我们将列表初始化更改为

一切都很好,即使非常大n

有人可以解释为什么会这样吗?是什么导致了段错误int list[n],当我们开始使用时停止了list = malloc(n*sizeof(int))

0 投票
1 回答
279 浏览

c++ - 具有类作用域的动态分配堆栈内存

一些编译器支持对 C++ 的扩展,因此可以在堆栈上动态分配内存。例如,g++支持alloca()以及 VLA。所有这些扩展都带有一个警告,即动态分配的内存在调用函数范围的末尾被“释放”。(编辑:为了澄清,我在'deallocated'周围使用引号,因为实际发生的是编译器正在递减/递增堆栈指针,因此为什么alloca()需要编译器支持。)这意味着alloca()在类的构造函数中分配的内存被释放一旦构造函数返回。

在构造函数通过一些重要步骤来确定要分配多少内存的类中,这种限制变得难以处理。类的用户必须在构造类的函数中分配内存,暴露一些可以说不应该暴露的内部结构。此外,在我的代码中加入变通办法以便能够使用alloca()或 VLA 通常不方便。

你能想出一些方法来规避这个限制,以便我可以使用alloca()VLA 或其他语言扩展,从而可以在类内分配内存并具有类范围吗?

0 投票
1 回答
216 浏览

objective-c - Objective-C中的可变大小数组?

好的,显然这有效:

这真的合法吗?我的意思是,它必须是,因为它可以编译(C 编译器会拒绝它为非常量)。我的问题的第一部分是:这是如何工作的?我假设它在堆栈上分配它?这与使用不同alloca()吗?

实际上,我发现了一些执行此操作的代码:

这行得通。但是,当我将缓冲区分配从循环内部移动到函数的第一行(就在foo声明之前)时,函数...停止工作。在调试器中,它首先访问局部变量,然后...退出。我没有看到任何异常被抛出,它没有崩溃,它只是程序继续运行(实际上函数返回一个字符串,返回值是NULL,这是返回变量被初始化的值)。我不确定发生了什么事。我的问题的第二部分是,鉴于第一部分,到底发生了什么?