好吧,假设我有一个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("errorn");
return -1;
}
gets(fraseUsuario[i]);
}
for (i = 0; i < 3; i++) {
printf("%sn", fraseUsuario[i]);
free(fraseUsuario[i]);
}
顺便说一句,free()
究竟是如何工作的?我的意思是,当我在最后调用它时,使用调试器,它似乎什么都不做,如果"Hello"存储在数组中,它将在free
调用后继续存储在那里。。。这是正常行为吗?
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 memoryn");
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 memoryn");
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] = ' '; // empty string
}
}
for(i = 0; i < 3; i++) {
printf("%sn", fraseUsuario[i]);
free(fraseUsuario[i]); // free memory allocated for strings
}
free(fraseUsuario); // free memory allocated for pointers to strings
fraseUsuario = NULL;
当您对通过调用malloc
获得的内存地址调用free
时,内存块将返回到堆上的空闲池。该存储器块随后可以被CCD_ 16重用。一旦你free
内存,你就放弃了对它的所有权。它不再属于,试图使用它是非法的,会导致未定义的行为和可能的segfault。
您只为一个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:不要使用gets()
,因为编译器或机器无法防止传入的缓冲区溢出。请改用fgets()
。
fgets(fraseUsuario[i], length, stdin);