在C中释放内存时出错

ant*_*009 0 c free

我写了一个练习指针和分配内存的问题.

但是,当我释放内存时,我正在获得堆栈转储.我在正确的地方解放了吗?我的程序还有什么问题可以使它不安全吗?

void display_names(char **names_to_display, char **output);

int main(void)
{
    char *names[] = {"Luke", "John", "Peter", 0};
    char **my_names = names;
    char *new_output[1024] = {0};
    size_t i = 0;

    // Print the ordinal names
    while(*my_names)
    {
        printf("Name: %s\n", *my_names++);
    }

    my_names = names; /* Reset */
    display_names(my_names, new_output);

    // Print the updated names
    while(new_output[i])
    {
        printf("Full names: %s\n", new_output[i]);
        i++;
    }

    // Free allocated memory
    free(new_output);

    getchar();

    return 0;
}

void display_names(char **names_to_display, char **output)
{
    while(*names_to_display)
    {   
        *output = (char*) malloc(strlen("FullName: ") + strlen(*names_to_display) + 1);
        if(!*output)
        {
            fprintf(stderr, "Cannot allocate memory");
            exit(1);
        }

        // Copy new output
        sprintf(*output, "FullName: %s", *names_to_display++);
        printf("display_names(): Name: %s\n", *output++);
    }   
}
Run Code Online (Sandbox Code Playgroud)

Laz*_*rus 12

您没有为new_output分配内存,它是由编译器分配的.free是在运行时malloc内存时使用,而不是在编译时释放编译器分配的内存.

你的new_output是一个局部变量,当它超出范围时会被释放,即在声明它的函数的右括号中.


小智 7

你的问题是当你说:

free(new_output);
Run Code Online (Sandbox Code Playgroud)

new_output是堆栈上的数组.它没有用malloc()分配,所以你不能用free()释放它.你需要释放new_output包含的指针.


mfa*_*mkh 7

char*new_display [1024]的声明意味着您声明了一个包含1024个元素的数组,每个元素都是一个指向char的指针.数组本身在这里静态分配,将在堆栈上保留1024个元素的数组.在您的示例中,您通过使用malloc分配内存并设置数组的每个元素来填充此数组的条目,这是您应该释放的内存,而不是静态分配的数组本身.

因此,您不需要调用free(new_display),而是需要遍历数组条目并执行free(new_display [i]),这样您只需释放已分配的内容.