我试图通过使用如下两种方式在我的16位内核中使用全局字符数组:
方式1
在globals.h中
char buffer[512];
Run Code Online (Sandbox Code Playgroud)
在kernel.c中
#include "globals.h"
extern char buffer[512];
void func1
{
printf("Address is %X",&buffer[0]);
}
Run Code Online (Sandbox Code Playgroud)
在module.c中
#include "globals.h"
extern char buffer[512];
void func2
{
printf("Address is %X",&buffer[0]);
}
Run Code Online (Sandbox Code Playgroud)
在这里,我发现两个打印的内存地址是不同的!?
方式2
在globals.h中
extern char buffer[512];
Run Code Online (Sandbox Code Playgroud)
在kernel.c中
#include "globals.h"
char buffer[512];
void func1
{
printf("Address is %X",&buffer[0]);
}
Run Code Online (Sandbox Code Playgroud)
在module.c中
#include "globals.h"
char buffer[512];
void func2
{
printf("Address is %X",&buffer[0]);
}
Run Code Online (Sandbox Code Playgroud)
在这里我也发现两个打印的内存地址都不同!?
我期待打印相同的内存位置,因为它是全局阵列.
任何人都能解释一下吗?
在这两种情况下,您都有buffer两个翻译单元中具有外部链接的对象的定义.
这在C中是不允许的(ISO/IEC 9899:1999,§6.9,5):
如果在表达式[...]中使用了使用外部链接声明的标识符,则整个程序中的某个地方应该只有一个标识符的外部定义[...]
您违反了此"必须"的要求,因此您的程序具有未定义的行为.
在这种情况下,您的编译器似乎创建了两个不同的对象 但是,不能保证.
解决这个问题:
extern声明放入标题中extern和/或初始化)到任何一个C文件中