gpt4 book ai didi

c++ - 使用 sbrk 自定义内存管理

转载 作者:太空宇宙 更新时间:2023-11-04 10:59:57 25 4
gpt4 key购买 nike

以下是一个简单的 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);

}

最佳答案

我看到了一些问题:

  1. 您还没有初始化memory_list
  2. salmalloc 缺少 else 部分,并且由于没有 return,在这种情况下它将返回随机垃圾。
  3. 您需要检查 sbrk 的返回值,它可能会失败(但是 salmalloc 看起来像是在进行中的工作,不是吗?)。
  4. 你需要检查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;
}

关于c++ - 使用 sbrk 自定义内存管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27343884/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com