【发布时间】:2014-06-15 19:26:34
【问题描述】:
我仍然熟悉使用 malloc、calloc 或 realloc。可以肯定的是,由于指针不正确或其他原因,我会遇到分段错误,但是对于我的一生,我不明白我在哪里做错了。该程序在用户输入为“5 5”时工作,除此之外的任何其他内容都会导致程序行为怪异,并且经常因分段错误而失败。矩阵 A 和 B 应该填充随机数,矩阵 C 应该对矩阵 A 和 B 求和,同时使用动态内存分配。我不熟悉 allocs,我刚刚开始了解指针和 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;
}
【问题讨论】:
-
我认为矩阵 A、B 和 C 的类型为
int**(int **matrixA = NULL, **matrixB = NULL, **matrixC = NULL;)
标签: c arrays pointers dynamic allocation