在C中释放内存时出错

时间:2009-06-06 08:46:41

标签: 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++);
    }   
}

3 个答案:

答案 0 :(得分:12)

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

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

答案 1 :(得分:7)

你的问题是当你说:

free(new_output);

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

答案 2 :(得分:7)

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

因此,您不需要调用free(new_display),而是需要遍历数组条目并执行free(new_display [i]),这样您就可以释放 分配的内容。< / p>