这是为数组分配内存的好方法吗?(C)



好吧,假设我有一个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);

相关内容

  • 没有找到相关文章