我正在尝试解决一个 C 问题,展示该语言的一些基本功能,例如函数构造、指针、内存分配和矩阵操作。但是,每当我运行它时,都会出现错误,稍后我会详细介绍。
程序是这样制定的:
用 C 编程语言编写一个程序,模拟处理具有正整数的大型稀疏矩阵。矩阵的最大行数和列数为 4000000000(4 * 109),所有 Matrix 字段的初始值为 0。矩阵数据存储在另一个具有 3 列和任意行数的 Matrix 中。大矩阵中每个不为零的字段的信息存储在较小矩阵的一行中,顺序如下:行数、列数和大矩阵中给定字段的值。示例:矩阵 [[0, 0, 7], [0, 0, 0], [4, 0, 0]] 保留为 [[0, 2, 7], [2, 0, 4]]。程序从标准输入读取一个大矩阵的行数和列数的数据,然后从标准输入读取并对矩阵进行运算。操作由指示操作类型的字符(运算符)给出,其后可能跟有执行数据操作所需的附加参数。可以执行以下操作:• d row col br - 在字段 [row] [col] 中写入 br* i row col 的值 - 打印 [row][col] 字段* z 中的值row - 打印在给定行中找到的 Matrix 元素的总和* n - 指定具有非零值的 Matrix 元素的数量* q - 完成程序。如果在执行其中一个操作时,a 的数量给出超出范围的行或列,矩阵显示错误值。确保只有存储在内存中的数据是不等于零的矩阵元素。
程序必须执行以下操作:
加载大行矩阵的类型数和列数。
调用一个从标准输入读取操作的函数,并调用执行该操作的相应函数。
执行步骤2,直到进入程序终止操作
听起来很长,但实际上一点也不难。这是我尝试编写代码的方式:
#include <stdlib.h>
#define MAX_SIZE 4000000000
#define TEST_GRESKE(red, kol, m, n) \
if ((red < 0 || red > m) || (kol < 0 || kol > n)){ \
printf("GRESKA"); \
exit(-1); \
}
int **upisi_vrednost(int **a, int red, int kol, int vr, int m, int n){
TEST_GRESKE(red, kol, m, n);
a[red][kol] = vr;
return a;
}
void ispisi_vrednost(int **a, int red, int kol, int m, int n){
TEST_GRESKE(red, kol, m, n);
printf(a[red][kol]);
}
int ispisi_zbir(int **a, int red, int m, int n){
if (red < 0 || red > m){
printf("GRESKA");
}
int suma = 0;
for (int j = 0; j < n; j++){
suma += a[red][j];
}
printf(suma);
return suma;
}
int main(){
int **a, **b, m, n, i, j, suma;
scanf("%d %d", &m, &n);
for (i = 0; i < m; i++){
a[i] = malloc(n * sizeof(int));
for (j = 0; j < n; j++){
a[i][j] = 0;
}
}
while(1){
char operator;
scanf("%s", &operator);
if (operator == 'q'){
for (i = 0; i < m; i++){
for (j = 0; j < n; j++){
free(a[i][j]);
}
}
break;
}
int red, kol, br;
if (operator == 'd'){
scanf("%d %d %d", &red, &kol, &br);
a = upisi_vrednost(a, red, kol, br, m, n);
}
if (operator == 'i'){
scanf("%d %d", &red, &kol);
ispisi_vrednost(a, red, kol, m, n);
}
if (operator == 'z'){
scanf("%d", &red);
ispisi_zbir(a, red, m, n);
}
if (operator == 'n'){
br = 0;
for (i = 0; i < m; i++){
for (j = 0; j < n; j++){
if (a[i][j] != 0){
br++;
}
}
}
printf(br);
}
}
}
但是,我根本没有得到正确的输出。我收到总线错误或分段错误,具体取决于运行程序的具体尝试,这些错误与尝试访问不存在的内存有关。
我做错了什么?
谢谢。