返回指向已分配内存的指针?

时间:2018-10-11 14:15:57

标签: c

我的任务是编写一个函数int *matrica1(int n)。该函数必须创建一个矩阵尺寸为nxn的矩阵,然后您必须分配其内存,并且主要是必须编写矩阵的元素。将指针mat1返回到**p时遇到问题,当我调用**p时我得到的是地址而不是数字,但是当我在函数中调用**mat1时我得到了数。我不明白吗?

#include <stdio.h>
int *matrica1(int n);

int main(){
    int n;
    printf("Input dimension of matrix:");
    scanf("%d", &n);

    int **p = matrica1(n);


    printf("Matrix \n\n");

    int i;
    n = n*n;
    for(i=0; i<n; i++){
        printf(" %d ", **(p+i));//I keep getting an address
    }
    return 0;
}

int *matrica1(int n){
    int mat[n][n];
    int i, j;
    int k=0;
    for(i=0; i<n; i++){
        for(j=0; j<n; j++){
            mat[i][j] = j+k;
        }
        k++;
    }

    int size = n*n;
    int **mat1 = (int*)malloc(size*sizeof(int));

    int m = 0;
    for(i=0; i<n; i++){
        for(j=0; j<n; j++){
            mat1[m] = &mat[i][j];
            m++;
        }
    }
    printf("\n\n**mat1 = %d", **mat1);//Here it returns me a number

    return mat1;
}

here how it looks like when running it

1 个答案:

答案 0 :(得分:1)

您要返回的是本地变量的地址。

mat1包含指向mat元素的指针。当matrica1返回时,mat超出范围,因此指向其元素的指针不再指向有效内存。取消引用这些指针将调用undefined behavior

其他问题:

  • 您要分配给mat1的内存大小不正确。由于它是int *的数组,因此您应该分配size*sizeof(int *)个字节,而不是size*sizeof(int)个字节。
  • matrica1被定义为返回int *,但是您正在返回int **并将结果分配给int **。函数的返回类型必须与您要返回的内容匹配。

mat1做成int *的数组,而不是将int做成数组,然后复制mat values 而不是地址

#include <stdio.h>
int *matrica1(int n);

int main(){
    int n;
    printf("Unesite dimenziju matrice:");
    scanf("%d", &n);

    // Have p match return type of function
    int *p = matrica1(n);


    printf("Matrix \n\n");

    int i;
    n = n*n;
    for(i=0; i<n; i++){
        // print array elements
        printf(" %d ", *(p+i));
    }
    return 0;
}

int *matrica1(int n){
    int mat[n][n];
    int i, j;
    int k=0;
    for(i=0; i<n; i++){
        for(j=0; j<n; j++){
            mat[i][j] = j+k;
        }
        k++;
    }

    int size = n*n;
    // change type of mat1 from int ** to int *, keep size the same
    int *mat1 = malloc(size*sizeof(int));

    int m = 0;
    for(i=0; i<n; i++){
        for(j=0; j<n; j++){
            // assign values of mat instead of addresses
            mat1[m] = mat[i][j];
            m++;
        }
    }
    printf("\n\n*mat1 = %d", *mat1);

    return mat1;
}

输出:

Unesite dimenziju matrice:5


*mat1 = 0Matrix 

 0  1  2  3  4  1  2  3  4  5  2  3  4  5  6  3  4  5  6  7  4  5  6  7  8