C-怪异的双指针更新内存位置



我正在运行以下代码以存储一个2D方形矩阵。代码读取每一行,将元素划分为空间,然后将它们存储到矩阵的各个单元格中。

输入格式:

第一行包含一个整数 n ,表示矩阵中的行和列数。下一行表示矩阵的行,每行包含空间分离的整数描述列。

示例输入/用于测试的输入:

5
11 2 4 2 3
4 5 6 -1 0
10 8 -12 8 7
1 2 4 -2 5
10 -2 1 0 2

程序:

#include <assert.h>
#include <limits.h>
#include <math.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void printMatrix(int n, int **matrix){
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            printf("%d ",matrix[i][j]);    
        }
        printf("n");
    }
}
int main(){
    int size,length;
    int **matrix,j;
    char *buff=malloc(1000),*token;    
    fgets(buff,1000,stdin);
    sscanf(buff,"%d",&size);
    matrix=malloc(sizeof(int)*size);
    for(int i=0;i<size;i++){
        //Allocating memory for all the cells in ith row
        matrix[i]=malloc(sizeof(int)*size);    
        buff='';
        buff=malloc(1000);
        fgets(buff,1000,stdin);
        length=strlen(buff);    
        if ((buff[length-1])=='n'){
            buff[length-1]='';
        }
        j=0;
        token=strtok(buff," ");
        while(token){
            matrix[i][j]=atoi(token);
            token=strtok(NULL," ");
            j++;
        }
        printf("n");
        printMatrix(i+1,matrix);

    }
    return 0;    
}

收到的输出

11 
11 2 
4 5 
11 2 4 
4 5 6 
10 8 -12 
11 2 4 2 
4 5 6 -1 
10 8 -12 8 
1 2 4 -2 

869149824 22073 4 2 3 
4 5 6 -1 0 
10 8 -12 8 7 
1 2 4 -2 5 
10 -2 1 0 2 

但是,在第四次迭代之后,我得到垃圾值869149824 22073。我不明白第一行是如何修改的。

我知道我可能会犯一个愚蠢的错误,但是我花了很多时间弄清楚这里缺少的东西。我感谢任何帮助。

我借此机会编辑和清理了您的程序,您对垃圾印刷品的问题如先前由您的内存管理造成的。

这是您程序的更新版本。

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
void printMatrix(int size, int i, int **matrix) {
    printf("n");
    for (int y = 0; y <= i; y++) {
        for (int x = 0; x < size; x++) {
            printf("%d ", matrix[y][x]);
        }
        printf("n");
    }
}
int main() {
    setvbuf(stdout, NULL, _IONBF, 0); // turn of buffering of stdout for debug.
    int size;
    int **matrix, j;
    char buff[1000], *token;
    fgets(buff, 1000, stdin);
    buff[strcspn(buff, "rn")] = '';
    sscanf(buff, "%d", &size);
    // allocate matrix
    matrix = malloc(sizeof(int*) * size);
    for (int i = 0; i < size; i++) {
        matrix[i] = malloc(sizeof(int) * size);
    }
    for (int i = 0; i < size; i++) {
        fgets(buff, 1000, stdin);
        buff[strcspn(buff, "rn")] = '';
        j = 0;
        token = strtok(buff, " ");
        while (token) {
            matrix[i][j] = atoi(token);
            token = strtok(NULL, " ");
            j++;
        }
        printMatrix(size, i, matrix);
    }
    return 0;
}

主要区别是:

  • buff的静态分配
  • 在输入扫描循环之前分配所需的所有内存。
  • 更改打印功能以按行打印矩阵行。

最新更新