如何解决全局静态或非静态?字符数组缓冲区,可从所有 c 文件访问
我有一个头文件“temp.h”和几个“.c”文件,每个文件中都有“#include
温度.h
static char buffer[1000]={'A','B','C','\0'};
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
而且我没有收到任何错误...当运行“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 数组(内存区域)的特定部分,并且所有引用都获得正确的读数?
谢谢
解决方法
使用您当前的方法,您有两个数组副本。相反,您需要在 temp.h
中声明数组(使用 extern 而不是静态)并在其他地方定义它,例如在 temp.c
中:
温度.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];
我希望这个解决方案可以帮助一些人。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。