分段错误 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);
注意在使用指向动态分配内存的指针之前,一般需要检查内存是否分配成功
我正在尝试使用一个函数来初始化一个数组,但我觉得它有些不对劲。当我编译它时,我得到了 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);
注意在使用指向动态分配内存的指针之前,一般需要检查内存是否分配成功