C中带有const变量的数组大小[重复]

Posted

技术标签:

【中文标题】C中带有const变量的数组大小[重复]【英文标题】:Array size with const variable in C [duplicate] 【发布时间】:2017-03-28 16:44:31 【问题描述】:

我发现了一个有趣的事实,但我不明白它是如何工作的。 以下代码完美运行。

#include <stdio.h>
 int main()
  const int size = 10;
  int sampleArray[size];
  typedef char String [size];
  return 0;

然后,我尝试仅使用具有全局范围的常量变量,它仍然可以。

#include <stdio.h>
const int size = 10;
 int main()
  int sampleArray[size];
  typedef char String [size];
  return 0;

但是,如果我也将数组的范围更改为全局,我会得到以下结果:

错误:在文件范围内对“sampleArray”进行了可变修改

#include <stdio.h>
const int size = 10;
int sampleArray[size];
typedef char String [size];
 int main()
  return 0;

我没听懂!如果我将 const 变量替换为 ex。到#define 也可以。 我知道 #define 变量是经过预处理的,据我所知 const 变量只是只读的。但究竟是什么构成了全局范围?

我不明白第三段代码有什么问题,如果第二段还可以的话。

【问题讨论】:

一些细节:C 有 const 对象,但没有 constant 对象。虽然const 似乎暗示了constant,但const 对象不是constant,而是更像“这个对象不应该改变,但如果尝试改变——谁知道会发生什么吗?”在 C 中,真正的 constant 是类似 42 的代码,它是一个类型为 int整数常量。因此const int size = 10; 不是 constant 变量。 数组没有固定大小,是变长数组。 就像他们说的,C 有const 对象,它们实际上是只读的变量。参照。 C++,它具有真正的 const 对象,这些对象实际上是编译时 constants a const 变量是编译器不允许修改的变量,而是一个变量。认为值在编译时可能是未知的(因为它可能来自其他文件)但数组大小必须是,所以它是禁止的。 【参考方案1】:

可变长度数组可能只有自动存储持续时间。 VLA 是在 C99 中引入的。

不允许声明具有静态存储持续时间的 VLA,因为 VLA 的大小是在运行时确定的(见下文)

在此标准之前,您可以使用类似宏

#define SIZE 10

//...

int a[SIZE];

或类似枚举的枚举器

enum  SIZE = 10; 

//...

int a[SIZE];

顺便说一句,你可以删除 const 限定符并直接写

int size = 10;

而不是

const int size = 10;

(在 C++ 中你必须使用 const 限定符,但在 C++ 中没有 VLA,除了一些编译器可以有自己的语言扩展)

考虑到 VLA 的 sizeof 运算符是在运行时而不是编译时计算的。

【讨论】:

谢谢,我才开始明白一点!但是,如果我在没有 const 的情况下尝试,我会在全局范围内遇到相同的错误。但是使用#define SIZE 10,它是有效的。 @BálintPap 正如我写的那样,VLA 可能没有所有全局数组都具有的静态存储持续时间。 A,我们开始吧,好吧!嗯,从来没想过。谢谢你的解释!我很感激!

以上是关于C中带有const变量的数组大小[重复]的主要内容,如果未能解决你的问题,请参考以下文章

用指针c ++更改const变量[重复]

JavaScript中带有一个数字的数组映射[重复]

LIKE 语句中带有变量的 SQL:无效的列索引 [重复]

为啥允许我在 C 中使用 const 限定变量作为数组大小?

“变量不能用作常量”c ++数组[重复]

使用Visual Studio 2017学习c ++ [重复]