简单的C语言编程;指针和内存分配的麻烦

问题描述 投票:0回答:0

我正在尝试解决一个 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);
        }
    }
}

但是,我根本没有得到正确的输出。我收到总线错误或分段错误,具体取决于运行程序的具体尝试,这些错误与尝试访问不存在的内存有关。

我做错了什么?

谢谢。

c pointers memory-leaks
© www.soinside.com 2019 - 2024. All rights reserved.