小白教程

 找回密码
 立即注册
查看: 9186|回复: 3

[已解决]为什么在 DLL 中 malloc() 的内存出现 access violation

[复制链接]

1

主题

1

帖子

3

积分

新手上路

Rank: 1

积分
3
发表于 2021-5-26 19:41:04 | 显示全部楼层 |阅读模式
各位大佬:

最近遇到一个问题,在开发 DLL 时,在其中 malloc() 了内存,但是访问时出现 access violation,想求教各位大佬这个原因可能是什么?
  1. DLLEXT long AMI_Init(void **AMI_dll_memory)
  2. {
  3.     mem = (struct model_memory*)malloc(sizeof(struct model_memory));
  4.     mem->submem = (struct submem*)malloc(sizeof(struct submem));
  5.     ......
  6.     *AMI_dll_memory = (void*)mem;
  7. }

  8. DLLEXT long AMI_Get(void *AMI_dll_memory)
  9. {
  10.     ....
  11.     mem = (struct model_memory*)AMI_dll_memory;
  12.     mem->submem->init();
  13. }

  14. // Defined in submem module
  15. struct {
  16.     int data;
  17.     struct list* next;
  18. }list;

  19. void init()
  20. {
  21.     struct list* n;
  22.     n = (struct list*)malloc(sizeof(struct list));
  23.     // access n->data caused memory access violation.
  24. }
复制代码
DLL 会被其他程序调用,第一次是调用 AMI_Init() 初始化一部分内存,并且将内存的首地址传递给参数 AMI_dll_memory,然后会调用 AMI_Get(),这时我在 AMI_Get() 中的 init() 函数上 malloc() 了一个新的节点,但是这里直接出现了 access violation,我想不明白是为什么。想求教各位大佬这是为什么?我确定这个 list n 的节点 malloc() 成功了,但是当我尝试访问时,出现 access violation,十分感谢各位指教。
最佳答案
2021-5-30 22:07:24
你给出的信息相对有限,而且程序也是错的,所以通常没有办法准确判断。
  1. struct {
  2.     int data;
  3.     struct list* next;
  4. }list;
  5.   
  6. void init()
  7. {
  8.     struct list* n;
  9.     n = (struct list*)malloc(sizeof(struct list));
  10.     // access n->data caused memory access violation.
  11. }
复制代码

就这,list 是一个变量,你确定 struct list 是合法的并且这段代码能通过编译?
回复

使用道具 举报

0

主题

1

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2021-5-28 18:15:46 | 显示全部楼层
调试,判断n是否为空?
回复

使用道具 举报

0

主题

1

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2021-5-30 22:07:24 | 显示全部楼层 &
你给出的信息相对有限,而且程序也是错的,所以通常没有办法准确判断。
  1. struct {
  2.     int data;
  3.     struct list* next;
  4. }list;
  5.   
  6. void init()
  7. {
  8.     struct list* n;
  9.     n = (struct list*)malloc(sizeof(struct list));
  10.     // access n->data caused memory access violation.
  11. }
复制代码

就这,list 是一个变量,你确定 struct list 是合法的并且这段代码能通过编译?
回复

使用道具 举报

1

主题

2

帖子

5

积分

新手上路

Rank: 1

积分
5
发表于 2021-6-1 13:29:44 | 显示全部楼层
我觉得鼠侠的意思是,这段代码是在把油门当作刹车踩,因此不能以此为证据说明刹车有问题。
而我想刹车或许是好的,或许有问题,或许...好吧,我没见过那辆车。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|小白教程 ( 粤ICP备20019910号 )

GMT+8, 2024-11-24 12:09 , Processed in 0.038132 second(s), 26 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc. Template By 【未来科技】【 www.wekei.cn 】

快速回复 返回顶部 返回列表