你是什麼意思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
重複使用。一旦你忘記了內存,你已經放棄了對它的所有權。它不再屬於給你,並試圖使用它是非法的,將導致未定義的行爲和可能的段錯誤。
首先,[不要施加'malloc']的結果(http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc)。 – pzaenger