gpt4 book ai didi

c - 如何防止c中的悬空指针/垃圾?

转载 作者:行者123 更新时间:2023-11-30 14:26:37 29 4
gpt4 key购买 nike

我是 C 新手,还没有真正掌握 C 何时决定释放对象以及何时决定保留对象。

heap_t 是指向结构堆的指针。

heap_t create_heap(){
heap_t h_t = (heap_t)malloc(sizeof(heap));
h_t->it = 0;
h_t->len = 10;
h_t->arr = (token_t)calloc(10, sizeof(token));
//call below a couple of times to fill up arr
app_heap(h_t, ENUM, "enum", 1);
return h_t;
}

让 h_t 通过

int app_heap(heap_t h, enum symbol s, char* word, int line){
int it = h->it;
int len = h->len;

if (it + 1 < len ){
token temp;
h->arr[it] = temp;
h->arr[it].sym = s;
h->arr[it].word = word;
h->arr[it].line = line;
h->it = it + 1;
printf(h->arr[it].word);
return 1;
} else {
h->len = len*2;
h->arr = realloc(h->arr, len*2);
return app_heap(h, s, word, line);
}

}

为什么我的 h_t->arr 充满了垃圾,最终出现段错误?我该如何解决?有任何 C 编码技巧/风格可以避免类似的事情吗?

最佳答案

首先,为了回答您有关崩溃的问题,我认为您出现段错误的原因是您未能将 len 乘以 sizeof(token)调用realloc。您最终会写入超出已分配 block 末尾的内容,最终触发段错误。

就“决定释放一个对象以及何时 [...] 保留一个对象”而言,C 不会为您做出任何决定:它只是在您通过调用 告诉它时执行此操作免费,无需询问您任何其他问题。这种“服从”有时最终会让你付出代价,因为你可能会意外地释放你仍然需要的东西。将指针设为 NULL 是一个好主意,可以提高更快地捕获问题的机会(不幸的是,由于共享指针,这不足以完全消除问题)。

free(h->arr);
h -> arr = NULL; // Doing this is a good practice

总而言之,在 C 语言中管理内存是一项繁琐的任务,需要大量的思考和纪律。您需要检查每个分配调用的结果以查看它是否失败,并在失败时执行许多辅助任务。

关于c - 如何防止c中的悬空指针/垃圾?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8896024/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com