sách gpt4 ai đã đi

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

In lại 作者:行者123 更新时间:2023-11-30 14:26:37 31 4
mua khóa gpt4 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;
} khác {
h->len = len*2;
h->arr = realloc(h->arr, len*2);
return app_heap(h, s, word, line);
}

}

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

1 Câu trả lời

首先,为了回答您有关崩溃的问题,我认为您出现段错误的原因是您未能将 len 乘以 sizeof(token)Gọiphân bổ lại。您最终会写入超出已分配 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/

31 4 0
Bài viết được đề xuất: javascript - 我们如何在 ES7 中调用类内部的方法?
Bài viết được đề xuất: c# - 使用局部 View MVC 5 上传文件
Bài viết được đề xuất: javascript - JS链接不起作用
Bài viết được đề xuất: C. 函数指针回调。与原型(prototype)不兼容。
行者123
Hồ sơ cá nhân

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá Didi Taxi miễn phí
Mã giảm giá Didi Taxi
Giấy chứng nhận ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com