【问题标题】:C array error: variable-sized object may not be initializedC 数组错误:可变大小的对象可能未初始化
【发布时间】:2017-03-06 04:22:58
【问题描述】:
char a[MAX_NR_DIGITS] = {5, 2, 1, 3, 5, 0, 7, 3, 4, 4};
int sizeA = 10;
char n[MAX_NR_DIGITS] = {5, 2, 6};
int sizeN = 3;

它返回了两倍的错误:可变大小的对象可能未初始化。 我该如何解决这个问题?

【问题讨论】:

  • 什么是MAX_NR_DIGITS?你从哪里得到错误?您可以尝试Minimal, Complete, and Verifiable Example 并告诉我们吗?并在构建时包含完整且完整且未经编辑的错误输出?
  • 你使用什么开发环境?
  • 我猜MAX_NR_DIGITS 不是一个常数。这只是一个猜测,因为你没有告诉我们MAX_NR_DIGITS 是什么
  • 显然它不是整数常量,否则 OP 不会收到该错误。
  • MAX_NR_DIGITS 为 10^8。我必须计算 a^n,结果最多可以有 10^8 位。所以 MAX_NR_DIGITS 是一个 const int 。

标签: c arrays


【解决方案1】:

如果这些数组在本地范围内声明并且MAX_NR_DIGITS 不是编译时整数常量,C 将尝试创建一个可变长度数组 (VLA)。这是一个在运行时确定其大小的数组。

如果是无意的,避免这种情况的最简单方法是确保 MAX_NR_DIGITS 是编译时常量,例如 #define MAX_NR_DIGITS 10。

当数组是 VLA 时代码不起作用的原因是初始化列表仅在编译时使用。所以C语言有个要求,就是不能初始化VLA。

对于 VLA,您可以通过在运行时为数组分配一个值来轻松解决此问题:

memcpy(n,  &(char[3]){5, 2, 6},  3);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-28
    • 1970-01-01
    • 1970-01-01
    • 2019-02-21
    • 1970-01-01
    • 2012-12-20
    • 2021-03-02
    • 2011-03-06
    相关资源
    最近更新 更多