- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是 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/
我遵循了 V. Romeo 关于实体管理的教程(在 GitHub 和 Youtube 上)。 然后我尝试重写类 CEntity、CComponent 和测试 CPosition(主要来自 Romeo
为什么下面的代码中有悬空引用?我认为对 const 的引用总是将临时对象的生命周期延长到它们的范围。 boost::filesystem::recursive_directory_iterator i
我有一个多线程应用程序,将传入消息发布到 rabbitmq 交换。使用 rabbitmq java 客户端,我在应用程序启动时创建了一个 rabbitmq 连接,并在我的所有线程中共享它。每个线程都会
我有一个 Git 存储库,其中有大量提交不在特定分支下,我可以 git show 它们,但是当我尝试列出包含它们的分支时,它没有返回任何内容。 我认为这是悬空提交/树问题(由于 -D 分支),所以我修
Tôi mới làm quen với Linux và phải chịu trách nhiệm duy trì hoạt động của máy chủ Linux duy nhất. Đây là máy chủ SVN của chúng tôi nên nó quan trọng hơn. Hóa ra người bảo trì trước tôi có một công việc cron sẽ chạy khi có quá nhiều tiến trình svnserve.
Tôi là một lập trình viên xuất sắc, rất giỏi!