gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 03:49:15 28 4
gpt4 key购买 nike

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

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com