使用 free() 时的 C 编程"Segmentation fault (core dumped)"



我正在尝试创建一个二维数组,但是当我在程序末尾使用 free 时,我总是收到"分段错误(核心转储)"错误。使用睡眠函数只是因为我想看看它是在创建数组后还是以后崩溃,并且程序在我使用 free(array) 后立即崩溃

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

void check(int number)
{
    if(number < 0)
    {
        fprintf(stderr, "You cannot use a value below zero!n");
    }
}

int create_array(int **array, int size)
{
    array = (int**)malloc(size * sizeof(int*));
    for(int i = 0; i < size; i++)
    {
        array[i] = (int*)malloc(size * sizeof(int));
    }
    printf("Successfully created the array!n");
    printf("The size of the array is %d * %d = %d", size, size, sizeof(array) / sizeof(int));
    return EXIT_SUCCESS;
}

int main(void)
{
    int N;
    printf("Please enter a value for N: ");
    scanf("%d", & N);
    check(N);
    int R;
    printf("Please enter a value for R: ");
    scanf("%d", & R);
    check(R);
    int **array;
    create_array(array, N);
    sleep(1);
    free(array);
    return EXIT_SUCCESS;
}

您只是在create_array()函数中修改array的本地副本。为了能够在main()中修改指针array,您需要向其传递一个指针(即函数需要接收int***)。

更简单地说,您可以从函数返回array并将其分配给main()中的array,并且不需要传递第一个参数。

您正在创建动态数组,但没有返回该数组的引用,这就是您无法释放它的原因。

您需要

按如下方式调用create_array()

int **array;
create_array( &array, N);

然后将其定义为:

int create_array(int*** array, int size)
{
    *array = (int**)malloc(size * sizeof(int*));
    for(int i = 0; i < size; i++)
    {
        (*array)[i] = (int*)malloc(size * sizeof(int));
    }
    printf("Successfully created the array!n");
    printf("The size of the array is %d * %d = %d", size, size, sizeof(array) / sizeof(int));
    return EXIT_SUCCESS;
}
但是,您

仍然会有内存泄漏,因为您只释放array而不是释放array[0]array[N-1]。 创建相应的destroy_array()函数会更安全。

相关内容

  • 没有找到相关文章