首页 > 解决方案 > 释放指针数组

问题描述

假设我有以下main功能:

int main(void) {
    char * strings[] = { "a", "b", "c", NULL};
    char **xstrings = malloc (4 * sizeof *xstrings);
}

freexstrings的正确方法是什么?例子是:

free(xstrings)

或者:

    while (*xstrings) {  
        free (*xstrings);    
        *xstrings++ = NULL;  
    }
}

这两种方式有什么区别,一种对,另一种错,或者它们有什么不同?

标签: c

解决方案


第一个例子是正确的,虽然

char * strings[] = { "a", "b", "c", NULL};

线未使用。

#include <stdio.h>
#include <stdlib.h>

int main() {
    char **xstrings = malloc(4 * sizeof *xstrings);
    free(xstrings);
    return 0;
}

上面,我们为 4 个指针分配空间char *并正确释放内存。

但是,通常情况下,我们希望为每个指针分配内存(除非变量最终指向某些数据char *,否则我们无法实现任何有意义的事情):xstrings

#include <stdio.h>
#include <stdlib.h>

int main() {
    int len = 4;
    char **xstrings = malloc(len * sizeof *xstrings);

    for (int i = 0; i < len; i++) {
        xstrings[i] = malloc(sizeof(*xstrings[i]) * some_length);
    }

    /* ... do something with the memory ... */

    /* free each xstring element */

    for (int i = 0; i < len; i++) {
        free(xstrings[i]);
    }

    free(xstrings);
    return 0;
}

线条

while (*xstrings) {  
    free (*xstrings);    
    *xstrings++ = NULL;  
}

没有多大意义。一旦内存为freed,就不能使用了。您可以使用临时变量来实现这一点,但与简单地使用循环相比会有点痛苦for(我们不想放弃原始xstrings指针,以便稍后释放它,我们需要一个临时变量在free向前移动指针后调用的循环中)。


推荐阅读