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

标签 c malloc free

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

相关文章:

c++ - 如何在函数中释放内存

pointers - 在 C 中将指针复制到指针 'contents'

c - 排队/出队奇怪?

c - Linux内核container_of宏示例编译错误

c - scanf() 将换行符保留在缓冲区中

c - 读取 csv 到结构

c - free(temp) 指针释放链表中的头指针-如何保留指向列表原点的指针

c - 在C中将椭圆绘制成矩形

c - 如果数组中的每个整数都不同,我该如何编写一个返回 true 的函数?

c - 将 switch/case 与 malloc() 一起使用