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

c - C99 - 为什么我不能在 Xcode 6 中使用可变长度字符数组?

在 Xcode 6 中获得了一个 C 命令行工具项目,除了一件小事之外,一切都很好:我一生都无法弄清楚如何为可变长度数组赋值!例如,考虑以下代码:

这编译得很好,但是当我调试它时,数组永远不会被分配!如果我在第 7 行设置断点,点击运行按钮并将鼠标悬停在 上str,它只会显示该名称,旁边有一个箭头,展开后什么也不显示!

如果我错了,请纠正我,但我相信这是我在这里写的完全有效的 C99 代码……那是什么?!我已经尝试过 GNU99 编译器(默认)和 C99 编译器,但均无济于事。

MTIA :-)

编辑:好的,我似乎对这里的一些人感到困惑,甚至可能是 PO'ed (因为我在这个问题上至少获得了 3 票反对票)所以让我稍微澄清一下。

我实际上是在 Mac OS X Yosemite 上编写一个 libcurl 应用程序,以通过 HTTP 将文件上传到 Web 服务器。最后,我希望能够在终端中输入“上传 [目标 URL] [文件或目录 1] [文件或目录 2] ... [文件或目录 N]”之类的内容,并让我的程序自动上传这些内容文件和目录到 [destination url]。输入的路径可以是相对于 CWD 或绝对的。

问题存在于我的uploadDirectory函数中,如下所示:

我知道我可以定义filePath一个巨大的常量大小来解决问题,但是多大才算太大?OS X 中文件路径的最大长度是多少?等等,等等……所以我宁愿把它做​​成合适的尺寸。

如果你冒着这篇文章的极端篇幅来到这里,谢谢你的耐心!我最初试图尽可能简洁地描述这个问题,但这显然只会引起混乱,所以我为此道歉:-)

0 投票
2 回答
210 浏览

c++ - 声明可变大小数组时出现意外的编译器行为

因此,我正在向一名学生教授基本 C 编程以进行测试。

谈到数组声明,我告诉他:

“你可以这样做”

-> 告诉他代码可以编译

“你也可以这样做”

-> 告诉他代码可以编译

“但你不能这样做!”

-> 告诉他代码不会编译......但它实际上可以编译!

myWholeLifeIsALie.jpg

我在 MinGW 中使用 DevC++。

汗,我打开Linux,做了一个简单的测试程序

它使用 g++ 和 gcc 编译和运行。

相反,MS Visual Studio 2010 编译器告诉我他“期望常量表达式”。这也是我对 g++/gcc 的期望。

我想我在这里错过了一些愚蠢的东西,但我什至不能......

0 投票
2 回答
138 浏览

c - 可变修改类型兼容性及其安全隐患

我对 C99 的可变修改类型系统产生了浓厚的兴趣。这个问题是受这个启发的。

检查这个问题的代码,我发现了一些有趣的东西。考虑这段代码:

这显然不会(也不会)编译。但是,这段代码:

编译时甚至没有警告(在 gcc 上)。

这似乎意味着可变修改的数组类型与任何非可变修改的数组类型兼容!

但这还不是全部。您会期望变量修改的类型至少会打扰使用哪个变量来设置其大小。但它似乎没有这样做!

也编译没有任何错误。

所以,我的问题是:这是正确的标准化行为吗?

此外,如果可变修改的数组类型真的与任何具有相同维度的数组兼容,这是否意味着令人讨厌的安全问题?例如,考虑以下代码:

编译并输出 100,没有错误或警告,什么都没有。在我看来,这意味着即使您通过 严格检查数组的大小,也可以轻松进行越界数组写入sizeof而不是进行一次强制转换,甚至打开所有警告!还是我错过了什么?

0 投票
2 回答
94 浏览

c++ - C++ 允许我在运行时分配一个数组,而不是给出错误

我读到需要在编译时知道数组大小。但是,当我这样做时,它编译并运行得很好,没有任何错误……怎么会?

0 投票
1 回答
97 浏览

c - Why arbitrary expressions can't be used as an array size, e.g. int[0,1]?

Ignoring static and * (for an omitted size) in between the [] brackets, the syntax for an array declarator is (from C99 TC3 (n1256) 6.7.5 p1; C11 (n1570) 6.7.6 p1):

direct-declarator: direct-declarator [ type-qualifier-listopt assignment-expressionopt ] [...]

Thus, a declaration like

is a syntax error, but

is allowed (at block scope, as this is a VLA).

There are certain cases where arbitrary expressions aren't allowed because this would cause ambiguity with comma used as a separator. For example, the arguments of a function call must be assignment expressions. I don't see, however, how such an ambiguity could be caused by

direct-declarator: direct-declarator [ type-qualifier-listopt expressionopt ]

Would this define a strict superset of the C language? Are there examples where this grammar is ambiguous?

C89*) required a constant expression in the syntax (which is a conditional expression) so this needed to be changed for C99 to allow VLAs. But I fail to see why it was changed to an assignment expression rather than to an expression. Is there any technical reason?

Gcc (and perhaps other compilers) had VLAs as an extension before they were added to the C standard, a conflict with some other extension could also be an explanation, but I'm not aware of such an extension. Gcc 3.0.4 accepts int a[0,1]; (with -std=gnu89 and -traditional), newer versions (tested with Gcc (Debian) 4.7.2-5) don't, so this looks unlikely to be the cause.

As far as I can see, this question equivalently applies to direct abstract declarators in type names.

*) According to this C89 draft, 3.5.4.

0 投票
2 回答
995 浏览

c99 - 将限制限定符与 C99 可变长度数组 (VLA) 一起使用

我正在探索 C99 中简单循环的不同实现如何根据函数签名自动矢量化。

这是我的代码:

当我编译时

我看到 VLA 案例不是自动矢量化的,但是当我添加标志来断言 no aliasing-fno-alias时,它们是。因此,我得出结论,我应该在源代码中规定这个,所以我尝试通过编译来做到这一点

编译器错误输出包括

但如您所见,我的 VLA 参数不允许使用限制。

所以我的问题是:有没有办法在 ISO C 中断言 VLA 没有别名?

请注意,我可以使用编译指示在源代码中断言没有别名 - 例如simd,omp simdivdep- 并获得我想要的自动矢量化,但这些不是 ISO C。

在这种情况下,ISO C 是指 C 的最新版本,在撰写本文时当然是 C11。

0 投票
1 回答
506 浏览

c++ - 跳转到 VLA 阵列时出现分段错误

以下示例演示了该问题:

最初,“剩余”变量的初始化有点长,我曾经goto在一行上初始化它。但是,现在这个例子给出了printf在线分段错误。

看起来数组没有正确初始化。

甚至 gdb 也无法打印 tmp 数组的地址:

我的 gcc 版本:

编译:

如果我删除 goto,或者用固定数组替换可变参数数组,分段错误就消失了。究竟发生了什么?

这是一个 gcc 错误吗?如果goto不允许和可变参数数组组合,应该有警告吗?

0 投票
2 回答
169 浏览

c++ - 为什么这段代码在使用可变数组大小时不会产生错误?

下面的代码应该会产生错误,因为编译器在编译期间无法知道数组大小。

我正在使用 gcc (Ubuntu 4.8.2-19ubuntu1) 4.8.2 进行编译,它不仅可以编译,而且可以以某种方式运行。

它是如何发生的?

0 投票
2 回答
257 浏览

c++ - 如何将动态二维数组传递给 C++ 中的函数

我正在尝试将动态二维数组传递给函数,但它给出了错误。我尝试显式提供数组尺寸并且它工作但动态不起作用,任何指针(双关语不是故意的)

我尝试了此处详细介绍的所有三种方法Passing 2D array in C

如果不是如上所示实例化数组,我使用类似的东西

它按预期工作。我收到以下错误

print_2d_array(5, arr);

0 投票
1 回答
356 浏览

c++ - 运行时大小的数组和指针衰减

我正在type_traits通过新的 C++14 运行时大小的数组测试标头中的一些工具,请考虑以下代码:

静态大小的数组g返回以下输出:

A11_i我假设未修改名称是11 个int类型元素的数组,所以这里一切都是正确的,但是使用这个新代码:

我收到错误:

我没想到可以将 size 参数传递给模板,但我期待自动数组到指针的衰减。我猜这个论点T &不适合这种衰减,所以我尝试将模板签名更改为:

结果相似:

而且我注意到运行时大小数组上的大小变量似乎与类型相关(而不是我们得到),这看起来很奇怪。mismatched types 'T*' and 'int [5]'mismatched types 'T*' and 'int [s]'

那么,问题是什么?

  • 为什么我在这个运行时大小的数组中没有得到数组到指针的衰减?
  • 用于调整运行时大小数组大小的变量是运行时大小数组类型的一部分还是我误解了错误?