为啥我们不能在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中创建一个带有常量的数组[重复]的主要内容,如果未能解决你的问题,请参考以下文章