[英]Segmentation fault (2D array with dynamic memory allocation) in C
我仍然无法使用malloc,calloc或realloc。 可以肯定的是,由于指针不正确或其他原因而导致分段错误,但是对于我的生命,我不知道自己在哪里做错了。 当用户输入为“ 5 5”时,该程序将运行,否则会导致该程序运行异常,并且经常会因分段错误而失败。 矩阵A和B应该使用随机数填充,并且矩阵C应该始终使用动态内存分配对矩阵A和B求和。 我对分配不熟悉,我才刚刚开始了解指针和2D数组。 有人可以解释我在做什么错。 这是完整的代码。
#include <stdio.h>
#include <stdlib.h>
#define ROWS 10
#define COLUMNS 10
void fillMatrix (int *matrix, int rows, int columns)
{
int i, j;
for(i = 0; i < rows; i++)
{
for(j= 0; j < columns; j++)
{
matrix[i * COLUMNS + j] = (rand() % 10) + 1;
}
}
}
void printMatrix (int *matrix, int rows, int columns)
{
int i, j;
for(i = 0; i < rows; i++)
{
for(j= 0; j < columns; j++)
{
printf("%2d ", *(matrix + i * COLUMNS + j));
}
printf("\n\n");
}
}
void sumMatrix (int *matrix, int *matrixA, int *matrixB, int rows, int columns)
{
int i, j;
for(i = 0; i < rows; i++)
{
for(j= 0; j < columns; j++)
{
matrix[i * COLUMNS + j] = matrixA[i * COLUMNS + j] + matrixB[i * COLUMNS + j];
}
}
}
int main()
{
int *matrixA = NULL, *matrixB = NULL, *matrixC = NULL;
int matrix[ROWS][COLUMNS], r, s, i;
srand((unsigned) time(NULL));
do{
printf("Rows and columns (min 1 1, max 10 10): ");
scanf("%d %d", &r, &s);
}while(r > ROWS || r < 1 || s > COLUMNS || s < 1);
matrixA = malloc(r * sizeof(int *));
for (i = 0; i < r; i++)
matrixA[i] = malloc(s * sizeof(int));
printf("\nMatrix A:\n\n");
fillMatrix(matrixA, r, s);
printMatrix(matrixA, r, s);
matrixB = calloc(r, sizeof(int *));
for (i = 0; i < r; i++)
matrixB[i] = calloc(s, sizeof(int));
printf("\nMatrix B:\n\n");
fillMatrix(matrixB, r, s);
printMatrix(matrixB, r, s);
matrixC = calloc(r, sizeof(int *));
for (i = 0; i < r; i++)
matrixC[i] = calloc(s, sizeof(int));
printf("\nSummed up (Matrix C):\n\n");
sumMatrix(matrixC, matrixA, matrixB, r, s);
printMatrix(matrixC, r, s);
free(matrixA);
free(matrixB);
free(matrixC);
return 0;
}
您将所有矩阵作为一维数组访问,因此应相应地分配它们。
例如: int* matrixA = malloc(r*s*sizeof(int));
。
就这样; 无需执行for (i = 0; i < r; i++)
循环。
此外,您在所有函数中使用的是COLUMNS
宏而不是columns
参数。
显然,如果COLUMNS > columns
,那么在某些时候您将遇到内存访问冲突...
这里的问题是矩阵中的存储位置不连续。 但是在所有的打印/填充/求和矩阵函数中,您都假设它们是。
假设一个2x2矩阵A。您的代码将以以下方式分配内存。 addr1是一个数组的起始地址,addr2是第二个数组的起始地址。
A [0] addr1(addr1 + sizeof(int))
A [1] addr2(addr2 + sizeof(int))
但这是您需要的:
A [0] addr1 addr1 + sizeof(int)
A [1](addr1 + 2 * sizeof(int))(addr1 + 3 * sizeof(int))
因此,您需要将malloc语句替换为一个malloc:matrixA = malloc(r * s * sizeof(int))此外,您假设每一行的元素数均为COLUMN,而不是's'。 如果是这种情况,则应使用malloc:matrixA = malloc(r * COLUMNS * sizeof(int)),但我不确定为什么需要其他未使用的列。
另外,int matrix [ROWS] [COLUMNS]似乎未使用。
对malloc有问题,您正在尝试创建数组数组而不是2d数组,则应将其修复:
matrixA = malloc(r * c * sizeof(int)); // no any kind of additional for loop here, 1 malloc per matrix
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define ROWS 10
#define COLUMNS 10
void fillMatrix (int *matrix, int rows, int columns)
{
int i, j;
for(i = 0; i < rows; i++)
{
for(j= 0; j < columns; j++)
{
matrix[i * COLUMNS + j] = (rand() % 10) + 1;
}
}
}
void printMatrix (int *matrix, int rows, int columns)
{
int i, j;
for(i = 0; i < rows; i++)
{
for(j= 0; j < columns; j++)
{
printf("%2d ", matrix[ i * COLUMNS + j]);
}
printf("\n\n");
}
}
void sumMatrix (int *matrix, int *matrixA, int *matrixB, int rows, int columns)
{
int i, j;
for(i = 0; i < rows; i++)
{
for(j= 0; j < columns; j++)
{
matrix[i * COLUMNS + j] = matrixA[i * COLUMNS + j] + matrixB[i * COLUMNS + j];
}
}
}
int main()
{
int *matrixA = NULL, *matrixB = NULL, *matrixC = NULL;
int matrix[ROWS][COLUMNS], r, s, i;
srand((unsigned) time(NULL));
do{
printf("Rows and columns (min 1 1, max 10 10): ");
scanf("%d %d", &r, &s);
}while(r > ROWS || r < 1 || s > COLUMNS || s < 1);
matrixA = malloc(COLUMNS*r * sizeof(int));
printf("\nMatrix A:\n\n");
fillMatrix(matrixA, r, s);
printMatrix(matrixA, r, s);
matrixB = calloc(r*COLUMNS,sizeof(int));
printf("\nMatrix B:\n\n");
fillMatrix(matrixB, r, s);
printMatrix(matrixB, r, s);
matrixC = calloc(r*COLUMNS, sizeof(int));
printf("\nSummed up (Matrix C):\n\n");
sumMatrix(matrixC, matrixA, matrixB, r, s);
printMatrix(matrixC, r, s);
free(matrixA);
free(matrixB);
free(matrixC);
return 0;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.