2D ARRAY (MATRIX) - 分段错误(CORE DUMPED)
2D ARRAY (MATRIX) - Segmentation Fault (CORE DUMPED)
我创建了以下程序,它接受用户输入的 nxn 数组并打印它。我的代码具有三个功能,即二维数组的内存分配、用户数据输入和显示存储的数据。虽然 1x1 到 4x4 矩阵工作正常,但 5x5 及以上矩阵会导致
Segmentation fault (core dumped)
为什么会这样?我究竟做错了什么 ?
以下是我的代码-
#include <stdio.h>
#include <stdlib.h>
int ** allocateMemory(int, int);
void createMatrix(int **, int, int);
void displayMatrix(int **, int, int);
int main()
{
int sizeA, sizeB;
printf("\nMatrix type(a x b): ");
scanf("%d %d", &sizeA, &sizeB);
printf("You entered: %d x %d\n", sizeA, sizeB);
int ** arrayA;
arrayA = allocateMemory(sizeA, sizeB);
printf("\nMATRIX A\n");
createMatrix(arrayA, sizeA, sizeB);
displayMatrix(arrayA, sizeA, sizeB);
getchar();
free(arrayA);
printf("\n");
return 0;
}
/*-----------------------------------------*/
/* FUNCTION TO ALLOCATE MEMORY TO AN ARRAY */
/*-----------------------------------------*/
int ** allocateMemory(int r, int c) //r - rows, c - columns
{
int ** ptr;
ptr = (int **) malloc(r*sizeof(int));
for(int i = 0; i < r; i++){
ptr[i] = (int *) malloc(c*sizeof(int));
}
return ptr;
}
/*-----------------------------*/
/* FUNCTION TO CREATE A MATRIX */
/*-----------------------------*/
void createMatrix(int ** array, int r, int c)
{
printf("\nEnter matrix values: \n");
for(int i = 0; i < r; i++){
for(int j = 0; j < c; j++){
scanf("%d", &array[i][j]);
}
}
printf("Array Created.");
printf("\n");
}
/*----------------------------*/
/* FUNCTION TO DISPLAY MATRIX */
/*----------------------------*/
void displayMatrix(int ** array, int r, int c)
{
printf("\n");
for(int i = 0; i < r; i++){
for(int j = 0; j < c; j++){
printf("%5d ", *(*(array + i) + j));
}
printf("\n");
}
}
在 allocateMemory()
你有
ptr = (int **) malloc(r*sizeof(int));
那一行是错误的,因为你想为一个指针数组分配内存,所以它应该是
ptr = malloc(r*sizeof(int *));
或
ptr = malloc(r*sizeof *ptr);
如果 sizeof(int) < sizeof(int *)
(通常在 64 位平台上),您没有分配足够的内存来调用未定义的行为。 "Undefined" 意味着任何事情都可能发生,包括代码似乎 运行 完美无缺(至少对于 r
和 c
在您的情况下的某些值)
题外话:
您可能想阅读有关 why you should not cast the result of malloc()
的内容
我创建了以下程序,它接受用户输入的 nxn 数组并打印它。我的代码具有三个功能,即二维数组的内存分配、用户数据输入和显示存储的数据。虽然 1x1 到 4x4 矩阵工作正常,但 5x5 及以上矩阵会导致
Segmentation fault (core dumped)
为什么会这样?我究竟做错了什么 ? 以下是我的代码-
#include <stdio.h>
#include <stdlib.h>
int ** allocateMemory(int, int);
void createMatrix(int **, int, int);
void displayMatrix(int **, int, int);
int main()
{
int sizeA, sizeB;
printf("\nMatrix type(a x b): ");
scanf("%d %d", &sizeA, &sizeB);
printf("You entered: %d x %d\n", sizeA, sizeB);
int ** arrayA;
arrayA = allocateMemory(sizeA, sizeB);
printf("\nMATRIX A\n");
createMatrix(arrayA, sizeA, sizeB);
displayMatrix(arrayA, sizeA, sizeB);
getchar();
free(arrayA);
printf("\n");
return 0;
}
/*-----------------------------------------*/
/* FUNCTION TO ALLOCATE MEMORY TO AN ARRAY */
/*-----------------------------------------*/
int ** allocateMemory(int r, int c) //r - rows, c - columns
{
int ** ptr;
ptr = (int **) malloc(r*sizeof(int));
for(int i = 0; i < r; i++){
ptr[i] = (int *) malloc(c*sizeof(int));
}
return ptr;
}
/*-----------------------------*/
/* FUNCTION TO CREATE A MATRIX */
/*-----------------------------*/
void createMatrix(int ** array, int r, int c)
{
printf("\nEnter matrix values: \n");
for(int i = 0; i < r; i++){
for(int j = 0; j < c; j++){
scanf("%d", &array[i][j]);
}
}
printf("Array Created.");
printf("\n");
}
/*----------------------------*/
/* FUNCTION TO DISPLAY MATRIX */
/*----------------------------*/
void displayMatrix(int ** array, int r, int c)
{
printf("\n");
for(int i = 0; i < r; i++){
for(int j = 0; j < c; j++){
printf("%5d ", *(*(array + i) + j));
}
printf("\n");
}
}
在 allocateMemory()
你有
ptr = (int **) malloc(r*sizeof(int));
那一行是错误的,因为你想为一个指针数组分配内存,所以它应该是
ptr = malloc(r*sizeof(int *));
或
ptr = malloc(r*sizeof *ptr);
如果 sizeof(int) < sizeof(int *)
(通常在 64 位平台上),您没有分配足够的内存来调用未定义的行为。 "Undefined" 意味着任何事情都可能发生,包括代码似乎 运行 完美无缺(至少对于 r
和 c
在您的情况下的某些值)
题外话:
您可能想阅读有关 why you should not cast the result of malloc()
的内容