繁体   English   中英

我究竟做错了什么? 如何将读取功能中分配的内存传递给显示功能?

[英]What am i doing wrong? How can i pass the memory allocated in read function to disp function?

我无法打印使用读取功能中的动态内存分配构建的矩阵。 请指导我将值从读取传递到显示功能。

我尝试过将指针传递给单指针中的指针,但是我不知道双指针,请帮帮我。

int i; //global
struct pass{
    int row,col,ele; 
} a1;

void disp(int** , struct pass);
void read(int** , struct pass);

void disp(int** p, struct pass a)
{
    printf("the triplet representation is\n"); //program stops here everytime
    for(i=0;i<=a.ele;i++){
        if(i==0){
            printf("row\t column\t element\n");
            printf("%d\t %d\t %d\n", p[i][0], p[i][1], p[i][2] );
        }
        else
            printf("%d\t %d\t %d\n", p[i][0], p[i][1], p[i][2] );
    }
}

void read(int** p, struct pass a)
{
    int i;
    printf("enter no. rows, columns, elements\n");
    scanf("%d %d %d", &a.row, &a.col, &a.ele);

    p=(int* *)malloc(sizeof(int*)*(a.ele+1));

    for(i=0;i<=a.ele;i++)
    p[i]=(int *)malloc(3*sizeof(int));

    p[0][0]=a.row; p[0][1]=a.col; p[0][2]=a.ele;

    printf("enter rows, columns, and elements\n");
    for(i=1;i<=a.ele;i++){
        scanf("%d %d %d", &p[i][0], &p[i][1], &p[i][2]);
    }
}

int main()
{
    int **p1;
    read(p1, a1);
    disp(p1,a1);
}

预期的输出应该是要打印的稀疏矩阵,但是在扫描元素之后拒绝这样做。

我对您的程序进行了几处更改。 请参阅代码中的注释。

#include "stdio.h"
#include "stdlib.h"

/* It is better to declare counter variable like i locally. */
/*int i; //global*/

/* This struct is not really needed since its contents is part of the sparse matrix. */
/*struct pass {
    int row, col, ele;
} a1;*/

void disp(int ** p)
{
    printf("the triplet representation is\n"); //program stops here everytime
    for (int i = 0; i <= p[0][2]; i++) {
        if (i == 0) {
            printf("row\t column\t element\n");
            printf("%d\t %d\t %d\n", p[i][0], p[i][1], p[i][2]);
        }
        else
            printf("%d\t %d\t %d\n", p[i][0], p[i][1], p[i][2]);
    }
}

/* Reads sparse matrix and returns int ** pointer to it.
   m[0] -> #rows, #cols, #elements
   m[1] -> row index, col index, value
   m[2] -> etc.
   m[#eleents] -> ...

   By returning pointer to sparse matrix, it makes code easier
   to understand than passing a pointer to the sparse matrix,
   that is int ***.
*/
int** read()
{
    int i;
    printf("enter no. rows, columns, elements\n");
    int row, col, ele;;
    scanf("%d %d %d", &row, &col, &ele);

    int ** p = (int**)malloc(sizeof(int*)*(ele + 1));

    for (i = 0; i <= ele; i++)
        p[i] = (int *)malloc(3 * sizeof(int));

    p[0][0] = row; p[0][1] = col; p[0][2] = ele;

    printf("enter rows, columns, and elements\n");
    for (i = 1; i <= ele; i++) {
        scanf("%d %d %d", &p[i][0], &p[i][1], &p[i][2]);
    }
    return p;
}

int main()
{
    int **p1 = read();
    disp(p1);
}

您可以在read()函数中为p1 2D数组分配一个内存指针。 一旦退出read()函数,该指针就会丢失。

当将p1作为** int发送时,编译器将按副本(此处为单位化)而不是地址发送第一个指针的 因此,如果在函数中对其进行更改,则仅修改该指针的副本,而不修改指针本身。

一种快速的解决方案是发送&p1,在您的read()函数中接收*** int,并在每次(* p1)[i] [j]时都将P1与'*'一起使用。

但是 ,这只是针对代码设计不当的快速而肮脏的修复程序。 例如,您可以将2D数组嵌入到struc中……这已经更加干净了:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM