Tag: 免费

是否允许编译器回收释放的指针变量?

有人声称 编译器可以自由地将指针变量重用于其他目的之后 realloc 被释放 ,所以你不能保证它具有与之前相同的价值 即 void *p = malloc(42); uintptr_t address = (uintptr_t)p; free(p); // […] stuff unrelated to p or address assert((uintptr_t)p == address); 可能会失败。 C11附件J.2读 使用指向通过调用free或realloc函数释放的空间的指针的值(7.22.3)[ 未定义 ] 但附件当然不是规范性的。 附件L.3(规范性的,但可选的)告诉我们,如果 引用通过调用free或realloc函数释放的空间的指针值(7.22.3)。 结果被允许是关键的未定义行为。 这证实了这一说法,但我希望从标准本身而不是附件中看到适当的引用。

malloc实现?

我正在尝试为C实现malloc和free ,我不知道如何重用内存。 我目前有一个如下所示的struct : typedef struct _mem_dictionary { void *addr; size_t size; int freed; } mem_dictionary; 我的malloc看起来像这样: void *malloc(size_t size) { void *return_ptr = sbrk(size); if (dictionary == NULL) dictionary = sbrk(1024 * sizeof(mem_dictionary)); dictionary[dictionary_ct].addr = return_ptr; dictionary[dictionary_ct].size = size; dictionary[dictionary_ct].freed = 1; dictionary_ct++; return return_ptr; } 当我释放内存时,我只会将地址标记为0 (这表示它是免费的)。 在我的malloc ,我会使用for循环来查找数组中的任何值等于0 ,然后将内存分配给该地址。 我有点困惑如何实现这一点。

如果在C中更改指针,将释放多少内存?

假设有20个内存块,指针p指向第一个块。 现在,当我这样做时: p++; free(p); 将释放多少块内存,为什么?