我的任务是编写一个函数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;
}
答案 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