为啥我们不能在c中创建一个带有常量的数组[重复]

Posted

技术标签:

【中文标题】为啥我们不能在c中创建一个带有常量的数组[重复]【英文标题】:Why we cannot create an array with a constant in c [duplicate]为什么我们不能在c中创建一个带有常量的数组[重复] 【发布时间】:2021-12-28 17:51:58 【问题描述】:

为什么下面这段代码是有效的 C++ 代码,却是无效的 C 代码?

int main()
    unsigned int const size_of_list = 20;
    const char* list_of_words[size_of_list] = "Some", "Array";

    for (unsigned int writing_index = 0; writing_index < size_of_list; writing_index ++)
        ;
        return 0;

【问题讨论】:

试试const unsigned int size_of_list = 20; 所以你的问题是为什么c 编译器拒绝此代码而c++ 编译器接受? @Irelia 限定词的顺序无关紧要。 错误信息很清楚。您可以声明可变长度数组,但不能对它们使用初始化程序。 如果您真的要问“为什么这是有效的 C++?”这两个问题,这个问题可能需要更多关注。和“为什么这个 C 无效?”否则可能会有近乎无限的这样的问题。 【参考方案1】:

在 C 中:20 是一个常量。unsigned int const size_of_list不是一个常量。

标题:“为什么我们不能在 c 中创建带有常量的数组”不适用于此代码。

const char* list_of_words[size_of_list] = "Some", "Array"; // Bad

这里的一个问题(和错误消息)是为什么无法初始化 VLA。答案是here。

使用常量,数组初始化工作正常。

const char* list_of_words[20] = "Some", "Array";  // Good

另一个问题是误认为const 使对象成为常量。它没有。


替代 C 代码

int main()
    // unsigned int const size_of_list = 20;
    #define size_of_list 20u

    const char* list_of_words[size_of_list] = "Some", "Array";
    for (unsigned int writing_index = 0; writing_index < size_of_list; writing_index ++)
        ;
    return 0;

如果您可以在数组本身中指定大小,那么您可以使用sizeof 运算符获取它的大小。这可能更适合让编译器计算大小而不是手动计数。当不使用C99 VLA 时,sizeof 也会产生一个编译时常量。

#include <stddef.h> /* size_t */
int main(void) 
    const char* list_of_words[] = "Some", "Array";
    const char list_of_char[sizeof list_of_words
        / sizeof *list_of_words] = 'S','A';
    const size_t size_of_list
        = sizeof list_of_words / sizeof *list_of_words;
    for (size_t writing_index = 0;
        writing_index < size_of_list; writing_index ++);
    return 0;

【讨论】:

谢谢,@chux。那么 const 的意义是什么?可以通过指向一些好的资源来帮助我吗? const 指示代码不要随后更改 size_of_list。除了 C 规范,没有建议的资源。

以上是关于为啥我们不能在c中创建一个带有常量的数组[重复]的主要内容,如果未能解决你的问题,请参考以下文章

在 MATLAB Coder 中创建用于指定数组大小的常量

在r中创建一个带有条件的组合列表[重复]

为啥我不能在 C++11 中创建一个 lambda 向量(相同类型)?

我必须在 C 中创建一个带有指向数组的结构数组

在Objective C中创建JSON数组[重复]

在C中创建一个没有重复的新数组