2014-12-07 81 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; 
}