【发布时间】:2015-10-18 01:14:17
【问题描述】:
由于某种原因,我的程序有时可以正常运行,有时只是以段错误结束。我正在尝试创建 malloc 的实现。如果我从5000 的大小开始,然后我做malloc(1000),我预计剩余内存大小为3984(由于内存条目的大小也是如此)。
当我输出带有printf 的剩余内存时,它有时会打印3984,有时会以分段错误结束。任何帮助将不胜感激。
#include "malloc-free-impl.h"
static char memArr[5000];
static char* memArrPtr = &memArr;
static MemEntryPtr head = NULL;
void* custom_malloc(int size) {
if (head == NULL) {
head = (MemEntryPtr) memArrPtr;
head->prev = NULL;
head->next = NULL;
head->isFree = 1;
head->size = sizeof(memArr) - sizeof(head);
}
MemEntryPtr curr = head;
while (curr->isFree != 1 && curr->size > size + sizeof(struct MemEntry)) {
curr = curr->next;
}
if ((curr->size - (size)) > sizeof(struct MemEntry)) {
MemEntryPtr newMemEntry = (MemEntryPtr) (&curr + sizeof(struct MemEntry) + size);
newMemEntry->prev = curr;
newMemEntry->next = NULL;
newMemEntry->isFree = 1;
newMemEntry->size = curr->size - (size + sizeof(newMemEntry));
printf("%d\n", newMemEntry->size);
curr->isFree = 0;
curr->next = newMemEntry;
return newMemEntry;
}
return NULL;
}
void* custom_free(MemEntryPtr memBlock) {
memBlock->isFree = 1;
return NULL;
}
int main(int argc, char** argv) {
MemEntryPtr node = (MemEntryPtr) custom_malloc(1000);
return 1;
}
【问题讨论】:
-
您的指针算法在 pub 中。尝试将 newMemEntryPtr 行更改为
MemEntryPtr newMemEntry = (MemEntryPtr) ((char *)curr + sizeof(struct MemEntry) + size); -
@amdixon 非常感谢,这似乎已经解决了这个问题。如果您将其发布为答案,我将选择它作为修复。
-
另外:你在哪里检查“custom_malloc() failed”???
-
@paulsm4 我正在尝试大量的打印消息,并使用 GDB 尝试查看 seg 错误发生在哪里,但这并没有太大帮助。我想我应该学会使用 valgrind。
标签: c segmentation-fault malloc