分段错误 C 数组和 Malloc

Segmentation Fault C Arrays and Malloc

我正在尝试使用一个函数来初始化一个数组,但我觉得它有些不对劲。当我编译它时,我得到了 Segmentation Fault 但不确定在哪里。有人可以指出我出错的正确方向吗?我的意思是,如果有更好的方法,请随时发表评论。 谢谢。

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

void initialize(int ** arr, int row, int col)
{
    int i; 

    arr = (int **) malloc(sizeof(int *) *col);
    for(i = 0; i < row; i++)
    {
        arr[i] = (int *) malloc(sizeof(int) * row); 
    }

}

void freeArray(int ** arr)
{
    free(arr);
}


int main()
{
    int **arr;
    int r, c; 

    initialize(arr, 3,6); 

    for(r = 0; r <= 3; r++)
    {
        for(c = 0; c <= 6; c++)
        {
            printf("%d ", arr[r][c] = r*c);
        }
        printf("\n");
    }

    freeArray(arr);
}

对于初学者来说,函数有一个错误。

void initialize(int ** arr, int row, int col)
{
    int i; 

    arr = (int **) malloc(sizeof(int *) *col);
    for(i = 0; i < row; i++)
    {
        arr[i] = (int *) malloc(sizeof(int) * row); 
    }

}

而不是在此语句中使用变量 col

    arr = (int **) malloc(sizeof(int *) *col);

你必须使用变量 row

arr = (int **) malloc(sizeof(int *) *row);

并且在此语句中而不是使用变量 row

arr[i] = (int *) malloc(sizeof(int) * row); 

你必须使用变量 col

arr[i] = (int *) malloc(sizeof(int) * col); 

至于主要问题,则函数按值接受在main中声明的指针。这意味着该函数处理指针的副本。副本的更改不会反映在原始指针上。

要么你需要通过一个指向函数的指针(通过引用传递)间接传递指向函数的指针,比如

void initialize(int *** arr, int row, int col)
{
    int i; 

    *arr = (int **) malloc(sizeof(int *) *row);
    for(i = 0; i < row; i++)
    {
        ( *arr )[i] = (int *) malloc(sizeof(int) * col); 
    }

}

并且该函数被调用为

initialize( &arr, 3,6);

或者当函数分配数组和returns指向数组的指针时更好

int ** initialize( int row, int col)
{
    int **arr;

    arr = (int **) malloc(sizeof(int *) *row);
    for( int i = 0; i < row; i++)
    {
        arr[i] = (int *) malloc(sizeof(int) * col); 
    }

    return arr;
}

并且该函数被调用为

int **arr = initialize( 3, 6 );

同样在 main 的嵌套 for 循环中使用了无效条件

for(r = 0; r <= 3; r++)
{
    for(c = 0; c <= 6; c++)
    {
        printf("%d ", arr[r][c] = r*c);
    }
    printf("\n");
}

你必须写

for(r = 0; r < 3; r++)
{
    for(c = 0; c < 6; c++)
    {
        printf("%d ", arr[r][c] = r*c);
    }
    printf("\n");
}

函数 freeArray 也必须按以下方式声明和定义

void freeArray(int ** arr, int row)
{
    if ( arr != NULL )
    {
        for ( int i = 0; i < row; i++ )
        {
            free( arr[i] );
        }
    }

    free( arr );
}

并称赞

freeArray(arr, 3);

注意在使用指向动态分配内存的指针之前,一般需要检查内存是否分配成功