三步篮 发表于 2021-5-26 19:41:04

为什么在 DLL 中 malloc() 的内存出现 access violation

各位大佬:

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

DLLEXT long AMI_Get(void *AMI_dll_memory)
{
    ....
    mem = (struct model_memory*)AMI_dll_memory;
    mem->submem->init();
}

// Defined in submem module
struct {
    int data;
    struct list* next;
}list;

void init()
{
    struct list* n;
    n = (struct list*)malloc(sizeof(struct list));
    // access n->data caused memory access violation.
}DLL 会被其他程序调用,第一次是调用 AMI_Init() 初始化一部分内存,并且将内存的首地址传递给参数 AMI_dll_memory,然后会调用 AMI_Get(),这时我在 AMI_Get() 中的 init() 函数上 malloc() 了一个新的节点,但是这里直接出现了 access violation,我想不明白是为什么。想求教各位大佬这是为什么?我确定这个 list n 的节点 malloc() 成功了,但是当我尝试访问时,出现 access violation,十分感谢各位指教。

江南燕 发表于 2021-5-28 18:15:46

调试,判断n是否为空?

张珂 发表于 2021-5-30 22:07:24

你给出的信息相对有限,而且程序也是错的,所以通常没有办法准确判断。
struct {
    int data;
    struct list* next;
}list;

void init()
{
    struct list* n;
    n = (struct list*)malloc(sizeof(struct list));
    // access n->data caused memory access violation.
}
就这,list 是一个变量,你确定 struct list 是合法的并且这段代码能通过编译?

银刺 发表于 2021-6-1 13:29:44

我觉得鼠侠的意思是,这段代码是在把油门当作刹车踩,因此不能以此为证据说明刹车有问题。
而我想刹车或许是好的,或许有问题,或许...好吧,我没见过那辆车。
页: [1]
查看完整版本: 为什么在 DLL 中 malloc() 的内存出现 access violation