2015-12-06 39 views
1

我試圖建立一個rudimendary存儲器分配器,其suppors一些功能:動態分配一個數組,改變和顯示的值它存儲

  • INITIALIZE(創建具有N個元素char數組),定格(釋放該分配給數組存儲器)
  • DUMP(顯示在該時刻存儲在數組中的所有值)
  • ALLOC(分配一定數目的字符的元素給用戶的,這樣他就可以在其中存儲的某些值)

我遇到了DUMP和ALLOC函數的問題:DUMP不打印存儲在數組中的值(它打印的是一些垃圾值),而且我也找不到如何修改存儲在數組中的值(ALLOC所需的值)。

下面我發佈了我的功能的源代碼:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

void initialize(int N, char **v) 
{ 
    int i; 
    *v = (char*)malloc(N * sizeof(char)); 
    printf("Initialized array with %d char elements \n", N); 
    for(i = 0; i < N; i++) 
    { 
     v[i] = 0; 
     printf("%hhd ", v[i]); 
    } 
} 

void finalize(char *v) 
{ 
    printf("Memory of the array has been freed \n"); 
    free(*v); 
} 

void dump(char **v, int N) 
{ 
    int i; 
    printf("Memory map:\n"); 
    for(i = 0; i < N; i++) 
    { 
     printf("%hhd ", v[i]); 
    } 
} 

在我的主要功能,我有char *vint N和調用功能: initialize(N, &v)finalize(&v)dump(&v,N)N是數組將要存儲的元素的數量。

+0

使用'的printf( 「%P」(無效*)V [1]);'打印指針。 – MikeCAT

+1

'finalize()'中的'free(* v);'是錯誤的,因爲它傳遞了一些可能不是有效指針的'free()'。 – MikeCAT

+1

不要將'malloc'和朋友的結果放在C中,並且'sizeof(char)'沒有用處,因爲它與'1'決不會有區別。 – Olaf

回答

2

既然你想打印存儲的元素,你只需要傳遞一個指針指針。只是通過指針:

char *v; 
... 
... 
finalize(v); 

和修改dump()

void dump(char *v, int N) 
{ 
    int i; 
    printf("Memory map:\n"); 
    for(i = 0; i < N; i++) 
    { 
     printf("%c ", v[i]); 
    } 
} 

同樣,你並不需要一個指向指針finalize()無論是。如果要修改指針,通常需要將指針傳遞給指針(如在initialize()中)。

initialize()也有問題。這個v[i]訪問錯誤,因爲你想修改指針,而不是指針本身。

你可以修改它:

void initialize(int N, char **v) 
{ 
    int i; 
    char *t = malloc(N * sizeof(char)); 

    if (t == NULL) {/* error*/ } 

    printf("Initialized array with %d char elements \n", N); 
    for(i = 0; i < N; i++) 
    { 
     t[i] = 0; 
     printf("%hhd ", t[i]); 
    } 
    *v = t; 
} 
相關問題