我创建了以下程序,该程序接受用户对nxn数组的输入并打印它。我的代码有三个功能,即为2D数组分配内存、用户数据输入和显示存储的数据。虽然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 %dn", sizeA, sizeB);
int ** arrayA;
arrayA = allocateMemory(sizeA, sizeB);
printf("nMATRIX An");
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 Behavior。"未定义"意味着任何事情都可能发生,包括代码似乎完美运行(至少在您的情况下,对于r
和c
的某些值(
离题:
您可能想了解一下为什么不应该强制转换malloc((的结果