c - 2D ARRAY (MATRIX) - 分段错误(核心转储)
问题描述
我创建了以下程序,它接受用户输入的 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 位平台上)您没有分配足够的内存来调用未定义的行为。并且“未定义”意味着任何事情都可能发生,包括代码似乎运行完美(至少对于您的情况的某些r
值c
)
无关:
您可能想了解为什么不应该转换 malloc() 的结果
推荐阅读
- c++ - 如何导出在头文件中完全定义的类?
- python - python信号模块,字节码,异步
- google-cloud-platform - GCE 实例组在 ZONE_RESOURCE_POOL_EXHAUSTED 中停留了几个小时
- javascript - 如何在html字符串中插入onClick事件
- java - 需要一个无法找到 REST API 类型的 bean
- swift - SwiftUI 2 Firebase 推送通知
- html - Google 手气不错的按钮
- security - 在新版 Google Analytics(分析)中,我如何保护自己免受黑客攻击?
- python - 创建熊猫表
- python - 在 bash 中更改具有特殊字符的文件名