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

跨C文件传递结构体至函数时地址异常导致变量未更新问题

问题根源与解决方案

你遇到的核心问题是结构体传值调用导致的副本问题:当前draw_menuOption函数的参数是menuOptionValue_s menu,这属于值传递——调用函数时会把原结构体完整复制一份,函数内部操作的是这个独立的副本,它的内存地址自然和原结构体不一样,而且不管你在函数里怎么修改这个副本,原结构体都不会有任何变化。

要解决这个问题,只需要把参数改成指针传递,让函数直接操作原结构体的内存空间即可,具体修改步骤如下:

1. 更新函数声明(menu.h)

把函数参数改成结构体指针类型:

void draw_menuOption(menuOptionValue_s*);

2. 修改函数实现(menu.c)

通过指针访问结构体成员(用->代替.),如果后续需要修改原结构体的成员,直接通过指针操作即可:

#include "defs.h"
#include "menu.h"
void draw_menuOption(menuOptionValue_s *menu){ 
    byte value = menu->max; 
    draw(x,y,value); 
    // 如果需要修改原结构体的参数,比如调整max值,直接写:
    // menu->max = new_value;
}

3. 更新调用方式(settings.c及其他调用处)

调用函数时传入结构体的地址(用&取地址符):

void setting_Init(void){ 
    setting.max = 10; 
    setting.min = 1; 
    second_setting.max = 20; 
    second_setting.min = 11; 
    draw_menuOption(&setting); 
    draw_menuOption(&second_setting); 
}

额外优化建议

如果draw_menuOption只需要读取结构体的值、不需要修改原结构体,可以把参数声明为const指针,这样能避免误修改原结构体,让代码更安全:

// menu.h里的声明
void draw_menuOption(const menuOptionValue_s*);

// menu.c里的实现
void draw_menuOption(const menuOptionValue_s *menu){ 
    byte value = menu->max; 
    draw(x,y,value); 
    // 此时如果尝试修改menu->max,编译器会直接报错
}

这种指针传递的方式完全适配你的多文件菜单设计——每个.c文件里的结构体都可以通过传地址的方式让draw_menuOption访问,不管是读取还是修改操作,都会直接作用在原结构体上,地址不一致的问题也会彻底解决。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 09:25:27