好吧,假设我有一个 char**
,这是分配内存的正确方法吗?
我的意思是:为 char**
本身分配内存,然后为每个 char*
...
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
之后继续存储在那里> 打电话...这是正常行为吗?
最佳答案
为 char ** 分配内存
本身是什么意思?当你定义它时,你在堆栈上为变量分配内存。以下语句定义(分配内存)fraserUsuario
并将其初始化为 NULL
。
char **fraseUsuario = NULL;
我认为您的意思可能是如何动态分配 char **
数组,即指向字符指针的指针。然后您再次为先前分配的数组的每个元素动态分配一个数组。 不要使用gets
。它已被弃用且使用不安全。请改用 fgets
。另外,请不要强制转换 malloc
的结果。如果您忘记包含包含其原型(prototype)的 header 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
重用。一旦您释放
内存,您就放弃了对它的所有权。它不再属于您并且尝试使用它是非法的并且会导致未定义的行为和可能的段错误。
关于c - 这是为数组分配内存的好方法吗? (C),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22021121/