>我有一个程序分布在多个文件中。有许多函数需要访问全局数组。我遇到的问题是在程序启动之前我不知道数组的大小。它打开一个文件,然后下载一些点,然后创建具有相应大小的数组。但是为了使数组是全局的,它需要在 main 函数之外声明,即在我知道点数之前。
我现在试图做的是:
文件1.c:
#include <stdio.h>
#include "file3.h"
int useful[];
int main()
{
int useful[10];
int i;
for (i = 0; i < 10; i++) {
useful[i] = i+1;
}
SPN();
return 0;
}
文件2.c:
#include <stdio.h>
#include "file3.h"
void SPN() {
int i;
for (i = 0; i < 10; i++) {
printf("%in", useful[i]);
}
}
文件3.h:
extern int useful[];
extern void SPN();
我在输出中得到的只是一堆 0。起初我认为第二个 int 有用[...in file1.c 创建一个具有不同内部名称的新数组,但考虑到 SPN() 在尝试访问数组边界之外的内存时不会触发分段错误,这似乎没有任何意义(如果有用[] 创建一个数组并且没有更改,它的默认大小为 1,即<10)。帮助?
int useful[10];
没有初始化全局int useful[];
或类似的东西。这是一个新变量,这里的循环
for (i = 0; i < 10; i++) {
useful[i] = i+1;
}
您正在修改第二个useful
而不触及全局。然后在函数结束时丢弃。
而是有一个像这样的全局变量:
int *useful;
并以此方式初始化它:
useful = malloc(sizeof(int)*10);
main
内部useful
的声明掩盖了外部声明。 这意味着您认为在全局变量中插入的值(在main
中)实际上进入了局部变量。
有关详细信息,请查看以下有关阴影的文章。
在 C 语言中查看范围规则也可能很有趣。