You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ARM嵌入式C编程:结构体内存访问遇‘未声明标识符’错误求助

ARM嵌入式C内存检索问题排查与修复

核心错误点解析

  • 未声明标识符问题:main.c中使用的saved_data是定义在data.c的全局变量,但main.c未通过extern声明该变量,编译器无法识别它的存在,直接报“未声明标识符”错误。这不是链接环节问题,是编译阶段的符号可见性问题。
  • 结构体初始化语法错误:data.c里结构体初始化的成员赋值用了分号;,C语言要求结构体初始化列表的成员之间必须用逗号,分隔,否则会触发编译错误。
  • 指针赋值类型不匹配:mydata是结构体指针类型,直接赋值结构体变量saved_data会导致类型不兼容,正确做法是取结构体的地址&saved_data赋值给指针。
  • 无效的空指针判断:if (&mydata)判断的是指针变量自身的内存地址,局部变量的地址永远非空,这个判断毫无意义,应该直接判断指针本身if (mydata)来确认是否指向有效内存。

修正后的代码

data.c

#include <data.h>
struct external_data saved_data = {
   .arr[0] = 1,
   .arr[1] = 2,
   .arr[2] = 3,
   .arr[3] = 4,
   .arr[4] = 5
};

main.c

#include <data.h>
// 声明跨文件全局变量,告知编译器该变量在其他文件定义
extern struct external_data saved_data;

int main(void) {
   struct external_data *mydata;
   // 取结构体变量的地址赋值给指针
   mydata = &saved_data;
   // 判断指针是否指向有效内存
   if (mydata) 
      return 0;
   else 
      return 1;
}

编译注意事项

ARM平台编译时需将所有相关源文件一起编译,例如使用ARM GCC工具链的命令:

arm-none-eabi-gcc data.c main.c -o target_program

内容的提问来源于stack exchange,提问作者Xhyub

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 13:57:25