动态数组实现中访问指针时出现 SIGBUS 错误

问题描述 投票:0回答:1

这只是动态数组的部分实现,所有功能尚未实现,只想检查功能的工作情况。

这是代码

#include <stdio.h>
#include <stdlib.h>
#define MINCAP 100

typedef struct{
    void **buf;
    int size, capacity;
} DynArray;

void *peek_at_loc(DynArray *dyn, int loc){
    if (!dyn || loc < 0 || loc > dyn->size) return NULL;
    return dyn->buf[loc-1];
}

void initialise(DynArray *dyn, int capacity){
    if(!dyn || dyn->buf) return;
    if (capacity <= 0){
        dyn->capacity = MINCAP;
    }else{
        dyn->capacity = capacity;
    }
    dyn->buf = (void**)malloc(dyn->capacity*sizeof(void*));
}
int main()
{   
    DynArray control;
    int a, b;
    initialise(&control, 5);
    printf("%p", control.buf);
    *control.buf = &a;
    *(control.buf+1) = &b;
    control.size = 2;
    int *c = peek_at_loc(&control, 2);
    printf("%p %p", &b, c);
    free(control.buf);
}

当我没有通过 malloc 释放返回到 buf 的指针时,我最初收到 SIGBUS 错误(我相信内存应该在进程结束后重新分配,这很好)。我必须能够将问题隔离到通过 main 函数访问 control.buf 。我不确定为什么这会成为一个问题,我正在寻找这个问题的解释和解决方案。

添加 free 命令后,我收到这些错误。

Dynamic_Arr(27352,0x1da499ec0) malloc: *** error for object 0x10062bf30: pointer being freed was not allocated
Dynamic_Arr(27352,0x1da499ec0) malloc: *** set a breakpoint in malloc_error_break to debug 0x10062bf30zsh: abort      ./Dynamic_Arr
c dynamic-arrays
1个回答
0
投票

问题可能出在

initialise
函数中,您有这样的情况:

if(!dyn || dyn->buf) return;

当调用

initialize
时,结构体的内容并未初始化。它的所有成员都将具有不确定的值。

需要确保结构体对象的所有成员都已初始化,尤其是指针

buf
是空指针。这可以轻松完成:

DynArray control = { NULL, 0, 0 };
© www.soinside.com 2019 - 2024. All rights reserved.