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



我有一个头文件,"温度h",以及若干";。c";具有"#包括<温度h>quot;它们中的每一个都包含header语句。我定义了一个全局静态字符数组;温度h";文件如下:

温度h

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

main.c

...
#include <temp.h>
int main()
{
strcpy(buffer,"xyz");
printf("nBuffer : %s",buffer);
func();
return 0;
}

其他.c

...
#include <temp.h>
int func()
{
printf("nInside func(), buffer : %s",buffer);
return 0;
}

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

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

我没有任何错误。。。并且当运行";输出;程序我期望这样的结果:

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?

为什么当我改变";(据说(全球性的";静态char数组在任何函数作用域(main或anyother(内的一个文件中,此更改不会在以后从任何其他文件反映到该char数组的所有未来引用,而是在每个文件(或每个函数内(中保留其内容??

如何做到这一点,我可以使用char数组(内存区域(的特定部分,它可以从所有"全局访问;文件";以及在它们的功能中,所有参考文献都得到了正确的读数?

thnx

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

温度h:

#ifndef TEMP_H
#define TEMP_H
extern char buffer[1000];
#endif

温度c:

#include "temp.h"
char buffer[1000] = "ABC";

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

好的。。。明白了!。。。现在我解决了!

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

注意:可以通过"#ifndef-"endif";成对的";。c";和";。h〃;编译的文件。

接下来,只在其中一个文件中包含以下定义声明:

char buffer[1000];

我希望这个解决方案能帮助一些人。

相关内容

  • 没有找到相关文章

最新更新