【问题标题】:Declaring an array with the size of a global [duplicate]声明一个具有全局大小的数组[重复]
【发布时间】:2016-02-22 22:01:03
【问题描述】:

我可以在 C 中声明一个带有全局元素的数组吗?
我可以用 const 类型声明吗? 它在 Xcode 上运行,但我担心它不正确,因为 glob 不是 const 类型(与静态类型相同)。

#include <stdio.h>
#include <stdilib.h>

int glob;
void main (){
    int const con;
    static int stat;
    int arr[glob];
    int arr2[con];
    int arr3[stat];
}

此外,我需要练习在 C 代码中查找错误并纠正它们以进行测试(CS 学生),但找不到相关资源。

提前谢谢你。

【问题讨论】:

  • int const con; 没用,因为变量(!)未初始化。 C 没有像 C++ 或 Pascal 这样的符号常量。它们都是不同的语言。并且在类型之后写const 是一个过时的特性;改写const int i = ...;
  • 澄清一下:如果您希望数组在变量发生变化时调整大小,那您就错了。
  • 我改变了主意。这是真正的副本:stackoverflow.com/q/18848537/3745896
  • int glob; ...int arr[glob] 无效 ref 因为 glob 为 0。

标签: c arrays coding-style


【解决方案1】:

如果没有提供初始化程序,全局变量和静态变量会自动初始化为 0。变量con local to main 然而不是,所以它的值是未定义的。

【讨论】:

  • 这里还有一个问题。您不能声明大小为零的数组。但这不是问题。
  • @River - int const con;,不是吗?
  • 其实con是未初始化的,导致UB。更糟糕的是,它无法获得赋值。 stat不是
  • @River - 哦,天哪,脑子放个屁。固定。
  • @Michi:因为他和我落入了同一个陷阱?而且因为他没有真正回答实际问题。
【解决方案2】:

我可以在 C 中声明一个带有全局元素的数组吗?

在 C99 和可选的 C11 中,支持可变长度数组 (VLA)。
Array length must be more than 0

int glob;
void main (){
  int arr[glob];     // bad array length 0
  int arrX[glob+1];  // OK array length > 0

我可以用 const 类型声明吗?

对于VLA,是的,数组大小的类型是否为const无关紧要。

// Assume VLAs are allowed
int a[5];         // OK 5 is a constant
const int b = 4;
int c[b];         // OK
int d = 7;
int e[d];         // OK

对于非 VLA,数组大小必须是一个常量。一个变量,const 与否,都不好。

// Assume VLAs not allowed
int a[5];         // OK 5 is a constant
const int b = 4;
int c[b];         // No good, b is not a constant.

此外,我需要练习在 C 代码中查找错误并纠正它们以进行测试

启用编译器的所有警告是第 1 步。

【讨论】:

    猜你喜欢
    • 2012-10-04
    • 1970-01-01
    • 2015-12-01
    • 1970-01-01
    • 2018-03-22
    • 1970-01-01
    • 2019-12-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多