【问题标题】:variable sized object may not be initialized even after using const for the variable即使在对变量使用 const 之后,可变大小的对象也可能不会被初始化
【发布时间】:2020-11-08 07:48:06
【问题描述】:

我使用 const 分配变量,但数组显示错误“可变大小的对象可能未初始化”

#include <stdio.h>
int main()
{

    const int city=10;
    const int week=2;
    int arr[city][week]={34,34,64,23,65,22,65,77,42,74,22,88,46,34,77,53,63,457,234,723};
    for(int i=0;i<city;i++)
    {
        for(int j=0;j<week;j++)
        {
            printf("%d",arr[city][week]);
        }
    }
}

【问题讨论】:

标签: c


【解决方案1】:

您正在为数组维度使用const 限定变量,而不是“整数常量表达式”。对于 C,这意味着您的数组是可变修改的类型,C 不允许使用初始化器。

正如其他人已经告诉您的那样,如果允许初始化,则语法必须是 = 而不是 ==

【讨论】:

  • 很抱歉 == 操作数是我打算使用的错字 =
【解决方案2】:

你有几个问题。

  1. 你发过主题了,就是不能用const int作为数组长度再初始化,因为会变成可变大小的对象,不能用constant初始化数字。你可以使用#ifdef 定义城市/周,然后就不会发生了。

  2. 您使用了比较 (==) 而不是赋值 (=)

改变:

int arr[city][week]=={34,34,64,23,65,22,65,77,42,74,22,88,46,34,77,53,63,457,234,723};

到:

int arr[city][week]={34,34,64,23,65,22,65,77,42,74,22,88,46,34,77,53,63,457,234,723};
  1. 您需要更改您的 printf 并可能添加换行符:

    printf("%d\n",arr[i][j]);

总结一下:

#include <stdio.h>
#define city 10
#define week 2
int main()
{
    int arr[city][week]={34,34,64,23,65,22,65,77,42,74,22,88,46,34,77,53,63,457,234,723};
    for(int i=0;i<city;i++)
    {
        for(int j=0;j<week;j++)
        {
            printf("%d\n", arr[i][j]);
        }
    }
}

【讨论】:

  • 错误消息表明原始源代码中不存在==,因为该消息是尝试使用= 初始化可变长度数组的结果。如果此时代码中有==,则消息会有所不同。所以我们知道问题中的== 是在准备问题时出现的拼写错误,因此应该通过对问题的编辑或对 OP 的请求来修复,而不是通过发布答案。换句话说,这个答案并没有回答被问到的真正问题。
  • @EricPostpischil 你说得对,我的回答解决了贴出的代码
  • 它也没有“解决”发布的代码,因为它留下了可变长度数组的初始化,违反了 C 2018 6.7.9 3 中的约束。
  • 感谢您澄清这一点,相应地更改了我的答案
【解决方案3】:

== 比较,= 分配
你甚至会打印相同的输出
我也更喜欢使用{a,b},{c,d}...

【讨论】:

  • 错误消息表明原始源代码中不存在==,因为该消息是尝试使用= 初始化可变长度数组的结果。如果此时代码中有==,则消息会有所不同。所以我们知道问题中的== 是在准备问题时出现的拼写错误,因此应该通过对问题的编辑或对 OP 的请求来修复,而不是通过发布答案。换句话说,这个答案并没有回答被问到的真正问题。
猜你喜欢
  • 1970-01-01
  • 2019-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-28
  • 1970-01-01
相关资源
最近更新 更多