2014-12-07 80 views
0

以下是简单的malloc实现的代码。一个链表用头部和尾部指针进行内存管理。现在在函数中,当列表未初始化时,只有一个调用实现,列表的头部被初始化。一旦我将基础指针返回到main,程序将给出segmentation fault。另一方面,下面的test函数具有几乎相同的参数,除了正确处理链表计算并显示结果之外。任何人都可以告诉我在这里错过什么?用sbrk自定义内存管理

#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

'如果(memory_list.head == NULL)'这哪里是初始化为NULL?为什么显示代码有效?为什么不显示不起作用的代码? – PaulMcKenzie 2014-12-07 15:02:52

+0

@PaulMcKenzie,'salmalloc'函数不起作用。 – user1343318 2014-12-07 15:12:08

+0

'另一方面,下面的测试函数几乎具有相同的参数,除了复杂的链表处理正确计算并显示结果。“您发布的函数是否也是如此? – PaulMcKenzie 2014-12-07 15:13:56

回答

1

我看到几个问题:

  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; 
}