【问题标题】:Array size with const variable in C [duplicate]C中带有const变量的数组大小[重复]
【发布时间】: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 变量是编译器不允许修改的变量,而是一个变量。认为值在编译时可能是未知的(因为它可能来自其他文件)但数组大小必须是,所以它是禁止的。

标签: c arrays scope constants


【解决方案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,我们开始吧,好吧!嗯,从来没想过。谢谢你的解释!我很感激!
猜你喜欢
  • 2016-08-08
  • 2019-03-02
  • 1970-01-01
  • 2021-09-18
  • 1970-01-01
  • 2018-05-12
  • 1970-01-01
  • 2019-01-05
  • 2020-09-10
相关资源
最近更新 更多