全局静态(或非静态?)字符数组(缓冲区),可从所有 c 文件访问

global static(or non-static?) char array(buffer) with access from all c files

我有一个头文件“temp.h”和几个“.c”文件,每个文件中都有“#include ”头语句。我在“temp.h”文件中定义了一个全局静态字符数组,如下所示:

temp.h

  static char buffer[1000]={'A','B','C','[=10=]'};

main.c

...
#include <temp.h>

int main()
{
  strcpy(buffer,"xyz");
  printf("\nBuffer : %s",buffer);
  func();
  return 0;
}

other.c

...
#include <temp.h>

int func()
{
  printf("\nInside func(), buffer : %s",buffer);
  return 0;
}

然后我使用以下命令编译所有文件:

  gcc -o output.o main.c other.c

而且我没有收到任何错误...当 运行 “output.o” 程序时, 我期待这样的结果:

 Buffer : xyz                     // Buffer was intentionally changed inside main
 Inside func(), buffer : xyz

但我得到:

 Buffer : xyz                     // Buffer was intentionally changed inside main
 Inside func(), buffer : ABC      // doesn't get updated buffer content- why?

为什么当我在任何函数作用域(main 或任何其他函数)内的一个文件中更改“(假定的)全局”静态字符数组的内容时,此更改不会反映到所有此字符数组的未来引用中之后的任何其他文件,而是在每个文件中((或者可能在每个函数中)它的内容都被保留了??

如何做到这一点,我可以使用 char 数组(内存区域)的特定部分,它可以从所有“文件”及其函数中全局访问,并且所有引用都能获得正确的读数?

thnx

使用您当前的方法,您拥有数组的两个副本。相反,您需要 declare temp.h 中的数组(使用 extern 而不是 static)并 define 在其他地方,例如在 temp.c:

temp.h:

#ifndef TEMP_H
#define TEMP_H

extern char buffer[1000];

#endif

temp.c:

#include "temp.h"

char buffer[1000] = "ABC";

您还可以为模块找到一个比 temp 更具描述性的名称。为缓冲区变量添加前缀也是一个好主意,例如temp_buffer 这样您就可以避免潜在的名称冲突,并使您自己和其他人更容易找到声明数组的位置。

好的...知道了!...现在我解决了!

在单独包含的头文件中((有问题的 temp.h))你必须写: extern char buffer[];

注意: 单独包含此 temp.h 文件可以通过其他“.c”和“.h”中的“#ifndef-#endif”对来实现编译文件。

接下来,仅在其中一个文件中包含以下定义语句:

char buffer[1000];

我希望这个解决方案对一些人有所帮助。