gpt4 book ai didi

c - 16 位 C 中的全局数组

转载 作者:太空狗 更新时间:2023-10-29 15:51:58 27 4
gpt4 key购买 nike

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

方式一

在 globals.h 中

char buffer[512];

在 kernel.c 中

#include "globals.h"
extern char buffer[512];

void func1
{
printf("Address is %X",&buffer[0]);
}

在模块.c中

#include "globals.h"
extern char buffer[512];

void func2
{
printf("Address is %X",&buffer[0]);
}

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

方式二

在 globals.h 中

extern char buffer[512];

在 kernel.c 中

#include "globals.h"
char buffer[512];

void func1
{
printf("Address is %X",&buffer[0]);
}

在模块.c中

#include "globals.h"
char buffer[512];

void func2
{
printf("Address is %X",&buffer[0]);
}

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

我期待打印与全局数组相同的内存位置。

有人能解释一下吗?

最佳答案

在这两种情况下,您都在两个翻译单元中定义了一个带有外部链接的对象 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 [...]

你违反了这个“应该”的要求,因此你的程序有未定义的行为。

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

解决这个问题:

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

关于c - 16 位 C 中的全局数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33125056/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com