问题标签 [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.
c - 变长数组的原型
我正在尝试编写一个函数,该函数在 c 中采用可变大小的数组。
它说对于可变长度数组,它需要在函数声明中限定。这意味着什么?我正在使用带有 LLVM 编译器 2.0 的 xcode 4.0。
谢谢您的帮助。
c - 使用可变长度数组是否安全?
我担心可变长度数组。当我想动态分配一个数组时,如果无法分配足够的内存并且我可以在我的程序中正确响应,我会得到 null。使用可变长度数组我没有得到这个信息。我该怎么办?
c - C 中不支持可变长度数组 C99
在 Visual Studio 2005 中,我正在尝试编译一个 .c 文件:
它不起作用,那么我的编译器遵循哪个标准?
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 吗?
c++ - gcc 对 VLA 的 sizeof 运算符评估是否不同?
g++
允许可变长度数组 (VLA)作为扩展。sizeof
VLA 上的operator的结果很有趣:
如果是sizeof(b)
,g++ 是否不遵循sizeof
仅在编译时评估的标准?是否sizeof
超载?
c - ISO C90 禁止变长数组
我正在动态计算数组的大小。就像是:
但只是 GCC 编译器说:
搜索所以我找到了这个答案:
C99 §6.7.5.2:
如果大小是一个不是整数常量表达式的表达式... ...每次对其进行评估时,它的值都应大于零。
所以,我重新声明了大小限制类型变量:
但它继续给我警告。这是 GCC 错误吗?
c - 在 C 中将可变长度数组声明为全局变量
如何将可变长度数组声明为全局变量?
在扫描长度之前在函数中声明可变长度数组时,它会编译但不会运行。它给出了分段错误。当相同的声明语句移到扫描语句下方时,它运行良好。
如果我们想要一个对所有函数全局可用的可变长度数组,我们该怎么做呢?这里的问题是数组的长度只能通过某些函数来扫描。
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))
?
c++ - 具有类作用域的动态分配堆栈内存
一些编译器支持对 C++ 的扩展,因此可以在堆栈上动态分配内存。例如,g++
支持alloca()
以及 VLA。所有这些扩展都带有一个警告,即动态分配的内存在调用函数范围的末尾被“释放”。(编辑:为了澄清,我在'deallocated'周围使用引号,因为实际发生的是编译器正在递减/递增堆栈指针,因此为什么alloca()
需要编译器支持。)这意味着alloca()
在类的构造函数中分配的内存被释放一旦构造函数返回。
在构造函数通过一些重要步骤来确定要分配多少内存的类中,这种限制变得难以处理。类的用户必须在构造类的函数中分配内存,暴露一些可以说不应该暴露的内部结构。此外,在我的代码中加入变通办法以便能够使用alloca()
或 VLA 通常不方便。
你能想出一些方法来规避这个限制,以便我可以使用alloca()
VLA 或其他语言扩展,从而可以在类内分配内存并具有类范围吗?
objective-c - Objective-C中的可变大小数组?
好的,显然这有效:
这真的合法吗?我的意思是,它必须是,因为它可以编译(C 编译器会拒绝它为非常量)。我的问题的第一部分是:这是如何工作的?我假设它在堆栈上分配它?这与使用不同alloca()
吗?
实际上,我发现了一些执行此操作的代码:
这行得通。但是,当我将缓冲区分配从循环内部移动到函数的第一行(就在foo
声明之前)时,函数...停止工作。在调试器中,它首先访问局部变量,然后...退出。我没有看到任何异常被抛出,它没有崩溃,它只是程序继续运行(实际上函数返回一个字符串,返回值是NULL
,这是返回变量被初始化的值)。我不确定发生了什么事。我的问题的第二部分是,鉴于第一部分,到底发生了什么?