16 位 C 中的全局数组
Global Array in 16 bit C
我正在尝试通过以下两种方式在我的 16 位内核中使用全局字符数组:
方式一
在globals.h
char buffer[512];
在kernel.c
#include "globals.h"
extern char buffer[512];
void func1
{
printf("Address is %X",&buffer[0]);
}
在module.c
#include "globals.h"
extern char buffer[512];
void func2
{
printf("Address is %X",&buffer[0]);
}
在这里我发现两个打印的内存地址不同!?
方式 2
在globals.h
extern char buffer[512];
在kernel.c
#include "globals.h"
char buffer[512];
void func1
{
printf("Address is %X",&buffer[0]);
}
在module.c
#include "globals.h"
char buffer[512];
void func2
{
printf("Address is %X",&buffer[0]);
}
这里我也发现打印的内存地址不同!?
我期待打印与全局数组相同的内存位置。
有人能解释一下吗?
在这两种情况下,您都在两个翻译单元中定义了带有外部链接的 object buffer
。
这在 C (ISO/IEC 9899:1999, §6.9, 5) 中是不允许的:
If an identifier declared with external linkage is used in an
expression [...], somewhere in the entire program
there shall be exactly one external definition for the identifier [...]
您违反了此 "shall" 要求,因此您的程序具有未定义的行为。
在这种情况下,您的编译器似乎创建了两个不同的 object。但是,不能保证。
解决这个问题:
- 将
extern
声明放入 header
- 和一个定义(没有
extern
and/or 和初始化)到任一 C 文件
特别是在情况 2 中,很明显您定义了 2 个不同的数组,并带有指向您的 .h 文件的外部链接 - 这样做没有意义,这与您的意图相去甚远。
现在,在情况 1 中,您正在尝试在 2 个翻译单元上进行外部链接,这将导致未定义的行为,正如 undur_gongor
已经指出的那样。
您想在一个 .c 文件中定义数组:
char buffer[512];
然后在.h文件中声明:
extern char buffer[];
我正在尝试通过以下两种方式在我的 16 位内核中使用全局字符数组:
方式一
在globals.h
char buffer[512];
在kernel.c
#include "globals.h"
extern char buffer[512];
void func1
{
printf("Address is %X",&buffer[0]);
}
在module.c
#include "globals.h"
extern char buffer[512];
void func2
{
printf("Address is %X",&buffer[0]);
}
在这里我发现两个打印的内存地址不同!?
方式 2
在globals.h
extern char buffer[512];
在kernel.c
#include "globals.h"
char buffer[512];
void func1
{
printf("Address is %X",&buffer[0]);
}
在module.c
#include "globals.h"
char buffer[512];
void func2
{
printf("Address is %X",&buffer[0]);
}
这里我也发现打印的内存地址不同!?
我期待打印与全局数组相同的内存位置。
有人能解释一下吗?
在这两种情况下,您都在两个翻译单元中定义了带有外部链接的 object buffer
。
这在 C (ISO/IEC 9899:1999, §6.9, 5) 中是不允许的:
If an identifier declared with external linkage is used in an expression [...], somewhere in the entire program there shall be exactly one external definition for the identifier [...]
您违反了此 "shall" 要求,因此您的程序具有未定义的行为。
在这种情况下,您的编译器似乎创建了两个不同的 object。但是,不能保证。
解决这个问题:
- 将
extern
声明放入 header - 和一个定义(没有
extern
and/or 和初始化)到任一 C 文件
特别是在情况 2 中,很明显您定义了 2 个不同的数组,并带有指向您的 .h 文件的外部链接 - 这样做没有意义,这与您的意图相去甚远。
现在,在情况 1 中,您正在尝试在 2 个翻译单元上进行外部链接,这将导致未定义的行为,正如 undur_gongor
已经指出的那样。
您想在一个 .c 文件中定义数组:
char buffer[512];
然后在.h文件中声明:
extern char buffer[];