繁体   English   中英

16位C的全局数组

[英]Global Array in 16 bit C

我试图通过使用如下两种方式在我的16位内核中使用全局字符数组:

方式1

在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]);
}

在这里我也发现两个打印的内存地址都不同!?

我期待打印相同的内存位置,因为它是全局阵列。

任何人都能解释一下吗?

在这两种情况下,您都有两个转换单元中具有外部链接的对象buffer定义。

这在C中是不允许的( ISO / IEC 9899:1999 ,§6.9,5):

如果在表达式[...]中使用了使用外部链接声明的标识符,则整个程序中的某个地方应该只有一个标识符的外部定义[...]

您违反了此“必须”的要求,因此您的程序具有未定义的行为。

在这种情况下,您的编译器似乎创建了两个不同的对象 但是,不能保证。

解决这个问题:

  • 把一个extern声明放入标题中
  • 和一个定义(没有extern和/或初始化)到任何一个C文件

特别是在案例2中,很明显你有2个不同数组的定义,与你的.h文件有一个外部链接 - 没有意义这样做,远非你的意图。

现在,在案例1中,您正在尝试在2个翻译单元上进行外部链接,这将导致未定义的行为,正如undur_gongor已经指出的那样。

您想在一个.c文件中定义数组:

char buffer[512];

然后在.h文件中声明它:

extern char buffer[];

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM