我有一个头文件,"温度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];
我希望这个解决方案能帮助一些人。