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

DLL访问违例(0xc0000005):结构体成员指针安全访问求助

问题背景

不可修改的C代码A定义如下:

// fsm.h
typedef unsigned char uint8;
typedef signed char int8;

typedef struct {
   uint8 var1;
   int8 var2;
   uint8 var3;
} Fsm;

// fsm.c
Fsm fsm;

用于观测A运行时变量的C++代码B定义:

// .hpp
typedef enum {
   STR_UINT8,
   STR_INT8,
} DataType;

typedef struct {
   DataType dtype;
   void* addr;
} ScopeVar;


// .cpp
std::map<std::string, ScopeVar> g_scope= {
   { "var1", {.dtype=STR_UINT8, .addr=&fsm.var1}},
   { "var2", {.dtype=STR_INT8, .addr=&fsm.var2 }},
};

需要在A运行时记录var1和var2的值,A实际运行在嵌入式设备,编译为DLL可在仿真软件中运行。

问题描述

在A任务的每次迭代中,通过以下代码收集数据:

std::string vals;
for(auto iter = g_scope.begin();iter!=g_scope.end();iter++) {
   switch (g_scope[iter->first].dtype) {
       case STR_UINT8:
           vals = std::to_string(*static_cast<uint8*>(g_scope[iter->first].addr));
           break;
       case STR_INT8:
           vals = std::to_string(*static_cast<int8*>(g_scope[iter->first].addr));
           break;
    }
    // 对vals进行操作....
}

编译后的DLL无法正常执行,仿真报错:access violation(code 0xc0000005) at 0x7ff8dd7aae82: Bad read on 0x0。

调试情况

多次调试后发现以下异常现象:

  • 指针值可读取,但无法传递给其他函数:
std::string vals;
for(auto iter = g_scope.begin();iter!=g_scope.end();iter++) {
   uint8 a;
   switch (g_scope[iter->first].dtype) {
       case STR_UINT8:
           a = *static_cast<uint8*>(g_scope[iter->first].addr); // 仅这一行可正常运行
           vals = std::to_string(a); // 执行此行触发访问违例
           observer.log(a); // spdlog实例已记录a的值,但执行后立即触发异常
           break;
       case STR_INT8:
           vals = std::to_string(*static_cast<int8*>(g_scope[iter->first].addr));
           break;
    }
    // 对vals进行操作....
}
  • 尝试用函数替代指针,失败;
  • 尝试用&fsm+offsetof(var1)作为指针,同样失败。
求助

如何安全地通过指针访问结构体成员的值?

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 16:15:22