这只是动态数组的部分实现,所有功能尚未实现,只想检查功能的工作情况。
这是代码
#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
问题可能出在
initialise
函数中,您有这样的情况:
if(!dyn || dyn->buf) return;
当调用
initialize
时,结构体的内容并未初始化。它的所有成员都将具有不确定的值。
需要确保结构体对象的所有成员都已初始化,尤其是指针
buf
是空指针。这可以轻松完成:
DynArray control = { NULL, 0, 0 };