以下是简单malloc
实现的代码。使用头尾指针启动链接列表以进行内存管理。现在在函数中,当列表未初始化时,只有一个调用被实现,其中列表的头部被初始化。一旦我将基础指针返回main
,程序就会给出segmentation fault
。另一方面,除了复杂的链表处理之外,以下test
函数具有几乎相同的参数,并且正确计算并显示结果。谁能告诉我在这里缺少什么?
#include <stdlib.h>
#include <stdio.h>
#include <assert.h>
#include <sys/types.h>
typedef struct Items{
size_t size_of_object;
size_t free;
} Items;
typedef struct Node{
void *ptr;
void *next;
Items Item;
}Node ;
typedef struct LinkedList{
Node *head;
Node *tail;
} LinkedList;
LinkedList memory_list;
void *salmalloc(size_t size_of_object) {
if (memory_list.head == NULL) {
memory_list.head = sbrk(sizeof(Node));
memory_list.head->ptr = sbrk(size_of_object);
memory_list.head->Item.size_of_object = size_of_object;
memory_list.tail = NULL;
memory_list.head->next = NULL;
memory_list.head->Item.free = 1;
return memory_list.head->ptr;
}
}
void *test(size_t size) {
void *p = sbrk(size);
return p;
}
void main(){
char *p = NULL;
char a = 'B';
p = salmalloc(sizeof(char));
*p = a;
printf("%c\n", *p);
}
答案 0 :(得分:1)
我看到一些问题:
memory_list
。salmalloc
缺少else
部分,由于没有return
,因此在这种情况下会返回随机垃圾。sbrk
的返回值,它可能会失败(但salmalloc
看起来像是正在进行的工作,不是吗?)。salmalloc
的返回值,它可能会失败。这是适用于我的系统的版本:
#include <stdlib.h>
#include <stdio.h>
#include <assert.h>
#include <sys/types.h>
typedef struct Items{
size_t size_of_object;
size_t free;
} Items;
typedef struct Node{
void *ptr;
void *next;
Items Item;
}Node ;
typedef struct LinkedList{
Node *head;
Node *tail;
} LinkedList;
LinkedList memory_list = { 0 };
void *salmalloc(size_t size_of_object) {
if (memory_list.head == NULL) {
memory_list.head = sbrk(sizeof(Node));
memory_list.head->ptr = sbrk(size_of_object);
memory_list.head->Item.size_of_object = size_of_object;
memory_list.tail = NULL;
memory_list.head->next = NULL;
memory_list.head->Item.free = 1;
return memory_list.head->ptr;
} else {
return NULL;
}
}
int main(){
char *p = NULL;
char a = 'B';
p = salmalloc(sizeof(char));
if (p == NULL) {
printf("Allocation failed.\n");
return 1;
}
*p = a;
printf("%c\n", *p);
return 0;
}