c - 嵌入式系统中的内存冲突

标签 c linker function-pointers

我正在使用适用于 PowerPC 的 Diab 编译器构建应用程序。我遇到内存冲突问题。

header1.h中我已经声明了

...
void NullFunct_1 (int);
...

然后在 main.c 中定义函数 NullFunct_1

    #include "header1.h"
...
           void NullFunct_1 (int f)
           {
              return;
           }

header2.h中我已经声明了

    struct tp_key 
    {
        int a;                    
        void (*fn_ptr)(int);     // function pointer    
        unsigned int b;             
        unsigned int c;                
        int d;                  
        int e;                 
    };

header2.c中,我按如下方式初始化数组Key

struct tp_key Key[48] = {0, &NullFunct_1, 0, 0, 0, 0};

header3.h中,我声明了全局变量Units

extern int Units;

header3.c中,我定义并初始化变量Units

int Units = 0; //Units variable can then assume the values of 0, 1000 or 10000 only.

程序已编译并链接,生成可执行文件时没有错误。

生成的链接编辑器内存映射如下

    input           virtual                        
    section         address     size     file
...
    .data           50036adc    00000484 header2.o
           Key      50036adc    00000480
           Xxxx     50036f5c    00000004

    .data           50036f60    00000170 header3.o
           Units    50036f60    00000004
...
...
        NullFunct_1 500038b8    0000000c main.o
...

您可能会注意到变量KeyUnits是内存“邻居”0x50036adc + 0x480 = 0x50036f5c

在某些情况下,变量 Units 包含值 1342191800 (十六进制为 0x500038B8),该值对应于变量 的内存地址Null_Fu​​nct_1

这是由于指令而发生的

struct tp_key Key[48] = {0, &NullFunct_1, 0, 0, 0, 0};

这是链接器问题,没有正确计算变量Key的内存大小吗?或者我犯了一个错误? 即使存在链接器问题,您能否建议如何避免此类问题?

最佳答案

这里没有“冲突”。

sizeof(struct tp_key) [24] * 48 的十六进制为 0x480。所以一切都是 100% 好的。

我的建议:不要专注于追寻“编译器错误”。假设编译器已经过测试并被数百万程序员使用。

关于c - 嵌入式系统中的内存冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59290662/

相关文章:

c - 为什么我的循环没有在我预期的时候退出?

c++ - 使用我的程序分发共享对象

linux - 如何使用 sudo yum install 安装 Fortran -dev 包

dll - 当我们获得实际的 .dll 实现时,为什么还需要 .lib stub 文件?

c++ - 如何使函数指针常量

c - 函数指针声明语法困惑

c - 计算机如何比较底层的两个数字?

c - 重写没有分支的代码

C编程,通过udp发送wav文件

C++ 指向其他类函数的指针函数