2014-02-25 33 views
1

好吧,想象一下我有一個char**,這是分配內存的正確方法嗎? 我的意思是:對於char**本身,然後每個char*分配內存...這是一個很好的方式來分配內存陣列的數組? (C)

char** fraseUsuario = NULL; 
int length = 100, i = 0; 

fraseUsuario = (char **) malloc(sizeof (char*)); //Not pretty sure 

for (i = 0; i < 3; i++) { 

    fraseUsuario[i] = (char *) malloc(length * sizeof (char)); 

    if (fraseUsuario[i] == NULL) { 
     printf("error\n"); 
     return -1; 
    } 

    gets(fraseUsuario[i]); 

} 

for (i = 0; i < 3; i++) { 
    printf("%s\n", fraseUsuario[i]); 
    free(fraseUsuario[i]); 
} 

而且順便說一句,究竟怎樣free()工作?我的意思是,當我最後調用它時,調試器看起來好像沒有「無」,如果「Hello」存儲在數組中,它將在free調用...之後繼續存儲在那裏正常的行爲?

+3

首先,[不要施加'malloc']的結果(http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc)。 – pzaenger

回答

0

您只分配內存一個char*但使用三個

爲了解決這個問題嗎:

#define STR_MAXIMUM (3) 

... 

size_t length = 100, i = 0; /* No need to use a signed type. 
           size_t is meant as index and size type. */ 
char ** fraseUsuario = malloc(STR_MAXIMUM * sizeof(*fraseUsuario)); 

for (i = 0; i < STR_MAXIMUM; ++i) 
{ 
    fraseUsuario[i] = malloc(length * sizeof(*fraseUsuario)); 

    ... 

還可以添加錯誤檢查系統調用。


另外^ 2:Do not use gets()因爲沒有辦法讓編譯器或防止溢出傳入的緩衝器中的機器。 Use fgets() instead

fgets(fraseUsuario[i], length, stdin); 
+0

如果我們說,我不知道要讀取多少個* char,並且我想在循環的每次迭代中分配一個* char,我應該執行兩個malloc? (一個分配* char和其他長度) – user3263115

+0

@ user3263115查看'realloc()'以防需要重新調整以前分配的內存塊的大小。 – alk

1

你是什麼意思allocate memory for the char **本身?您在定義堆棧時爲堆棧上的變量分配內存。以下語句定義(分配內存)fraserUsuario並將其初始化爲NULL

char **fraseUsuario = NULL; 

我想你大概的意思是如何動態分配的char **數組,即指針的指針到一個字符。然後再次爲前面分配的數組的每個元素動態分配一個數組。 請勿使用gets。它被棄用和不安全的使用。改爲使用fgets。另外,請不要投下malloc的結果。如果您忘記包含標題爲stdlib.h的標題,則無法獲得任何好處,並且可能會遇到錯誤。這是你如何做到的。

char **fraseUsuario = NULL; 
int max_string_len = 100 + 1; // maximum string length. +1 for null byte 
int num_string = 3;   // number of strings to read 
int i, j; 

fraseUsuario = malloc(num_string * sizeof *fraseUsuario); 
if(fraseUsuario == NULL) {  // check for NULL 
    // handle the case 
    printf("not enough memory\n"); 
    return -1; 
} 

for(i = 0; i < num_string; i++) { 
    fraseUsuario[i] = malloc(max_string_len * sizeof(char)); 
    if(fraseUsuario[i] == NULL) {  // check for NULL 
     printf("not enough memory\n"); 
     for(j = 0; j < i; j++) 
      free(fraseUsuario[j]); // free memory before returning 
     free(fraseUsuario);   // free memory before returning 
     return -1; 
    } 
    if(fgets(fraserUsuario[i], max_string_len, stdin) == NULL) { 
     // reading string failed 
     *fraserUsuario[i] = '\0'; // empty string 
    } 
} 

for(i = 0; i < 3; i++) { 
    printf("%s\n", fraseUsuario[i]); 
    free(fraseUsuario[i]); // free memory allocated for strings 
} 
free(fraseUsuario);   // free memory allocated for pointers to strings 
fraseUsuario = NULL; 

當你調用上,您通過調用得malloc內存地址free,存儲器塊返回給堆空閒池。這個內存塊可以在以後被malloc重複使用。一旦你忘記了內存,你已經放棄了對它的所有權。它不再屬於給你,並試圖使用它是非法的,將導致未定義的行爲和可能的段錯誤。

相關問題