c - 嵌入式系统内存冲突
问题描述
我正在为 PowerPC 构建一个带有 Diab 编译器的应用程序。我遇到了内存冲突问题。
在header1.h
我已经宣布
...
void NullFunct_1 (int);
...
然后函数NullFunct_1
定义在main.c
#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
...
您可能会注意到变量Key
并且Units
是内存“邻居” 0x50036adc + 0x480 = 0x50036f5c
。
在某些情况下,变量Units
包含1342191800
(0x500038B8 in hex)
对应于变量内存地址的值Null_Funct_1
这是因为指令
struct tp_key Key[48] = {0, &NullFunct_1, 0, 0, 0, 0};
这是没有正确计算变量 Key 的内存大小的链接器问题吗?还是我犯了一个错误?即使存在链接器问题,您能否建议如何避免此类问题?
解决方案
这里没有“冲突”。
sizeof(struct tp_key) [24] * 48 十六进制为 0x480。所以一切都100%没问题。
我的建议:不要专注于追逐“编译器错误”。假设编译器已经过测试并被数百万程序员使用。
推荐阅读
- java - 如何修改此递归回溯算法(倒计时:游戏)以找到所有解决方案而不仅仅是一个解决方案?
- linux - Bash 替换版本字符串中的次要版本
- python - 一段时间后使用 nohup 执行 python 脚本时出错:selenium.common.exceptions.TimeoutException:消息:
- python - scipy.solve_ivp 的浮点精度
- python - 如果我使用单个字段,Django 不会提交我的表单
- python - Beautiful Soup,有条件地提取 Href
- snowflake-cloud-data-platform - 是否可以针对 blob 存储表创建外部阶段?
- sql - 为什么我在尝试加入表时收到 Oracle 错误 ORA-01790?
- hangouts-chat - 如何删除 Bot 消息格式的文本省略号(Google Chat API)
- java - 如何在 android 服务中的 onTaskRemoved 中设置 Firebase 侦听器