【问题标题】:How to share global array between c files如何在c文件之间共享全局数组
【发布时间】:2021-03-08 18:59:33
【问题描述】:

我正在尝试在两个文件之间共享一个全局数组,如下所示:

ma​​in.c

#include <stdio.h>
#include "another.h"
int n=10;
int a[n];

void main(){
  printf("Enter value:\n");
  scanf("%d",&a[0]);
  display();
}

另一个.h

#include <stdio.h>
extern int n;
extern int a[n];

void display(){
  printf("%d",a[0]);
  return;
}

但是,我收到以下错误: 在文件范围内可变地修改“a”

我无法理解为什么会出现此错误。请解释一下?

【问题讨论】:

  • 全局可变长度数组在 C 中无效。另一种方法是将 n 替换为 #define MY_ARRAY_LEN 10
  • "没有办法在 C 中将可变长度数组声明为全局变量,因为它必须在知道它的大小之前分配,所以编译器无法知道它应该分配多少内存它”这就是您共享的链接所说的。但是,我在初始化数组之前将数组 n 的大小定义为 10,以便编译器确切知道要分配多少内存。所以即使这样它也行不通?

标签: arrays c scope


【解决方案1】:

以下似乎是创建可变长度数组的尝试。但不管它实际上是什么,以下两行中的第二行是不合法的:

extern int n;
extern int a[n];

n 在用于创建a 时尚未定义。

如果您正在考虑创建 VLA...
根据定义,VLAs 仅在堆栈上使用自动存储持续时间创建。这使得它们无法用作 extern 或任何类型的全局范围变量。

但是,您可以在头文件中声明size 变量作为extern,以便它对于包含该文件的任何源文件都是项目全局的,并且一旦它是已定义 它可用于调整项目范围内的任何数组的大小:

extern size_t array_size;
extern int gArray[100];

#include "some.h"
...
size_t array_size = 20;
int gArray[100] = {0};//Not a VLA
...
int main(void)
{
   int array[array_size] = {0};
   for(int i=0;i<sizeof(gArray);i++
   {
       //populate each element of gArray here
   }
   ...

#include "some.h"
int otherFunc(void)
{
   //gArray is visible here just as it is in main(), with exactly the same values.
   int local array[array_size] = {gArray[0],gArray[1],gArray[2],...,gArray[19]};

   ...

【讨论】:

  • 好吧,我明白了。那么如何在两个文件之间共享一个数组呢?可以举个例子吗?
  • 只要你不需要它是一个变长数组,一个数组可以用extern范围声明,然后在一个.c文件中定义,_before它第一次使用,就像我上面说明的变量一样。
  • 感谢您的帮助。
  • @Biwadeep - 在项目全局数组 gArray 的简单示例中编辑。见帖子。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-28
  • 2019-10-08
  • 1970-01-01
  • 2010-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多