在C中打印矩阵时获取垃圾值

时间:2013-09-17 17:24:47

标签: c pointers matrix

三年前我学习了C编程语言,现在当我在java和c#的经验之后重新访问它时,我正面临一些指针问题。所以我试着写一个简单的矩阵添加程序,但我不知道为什么我在打印矩阵时会得到一些奇怪的值。

代码:

#include <stdio.h>

int* sumOfMat(int* m1,int* m2)
{
    printf("Matrix A: \n");
    printMat(m1);
    printf("Matrix B: \n");
    printMat(m2);
    int mat3[3][3];
    int row=0,col=0,k=0,sum=0;
    for(;row<3;row++)
    {
        col=0;
        for (;col<3 ;col++ )
        {
            sum=(*m1+*m2);
            m1++;
            m2++;
            mat3[row][col]=sum;
        }
    }

    printf("Result: \n");
//    printMat(mat3);  //this statement is giving me a correct output.
    return mat3;
}

void printMat(const int m[3][3])
{
    int row,col;
    for (row=0;row<3 ;row++ )
    {
        for (col=0;col<3 ;col++ )
        {
            printf("%d\t",m[row][col]);
        }
        printf("\n");
    }

}


int main(void) {
int mat1[3][3]={{1,2,3},{4,5,6},{7,8,9}};
int mat2[3][3]={{1,2,3},{4,5,6},{7,8,9}};
//add
printf("Sum of the metrices : \n");
int* x=sumOfMat(&mat1,&mat2);
printMat(x);   // this call is providing me some garbage values at some locations.
return 0;
}

输出:

Success  time: 0 memory: 2292 signal:0
Sum of the metrices : 
Matrix A: 
1   2   3   
4   5   6   
7   8   9   
Matrix B: 
1   2   3   
4   5   6   
7   8   9   
Result: 
2   134514448   134514448   
8   10  12  
14  16  -1216458764 

Demo

问题:为什么我收到此错误以及如何纠正错误。

3 个答案:

答案 0 :(得分:5)

int mat3[3][3];

堆栈上分配您的2d数组

你正在返回一个指向这个数组的指针。

return mat3;

不幸的是,当函数调用结束时,堆栈被解开并且数组的内存不再存在,所以你有一个指向垃圾的指针。

一种解决方案是在main函数中分配数组,并将其作为参数传递给sumOfMat

答案 1 :(得分:2)

永远不要返回指向自动变量的指针:

int *f(void)
{
    int i;
    ....
    return &i;
}

i返回后变量f不存在,因此指向它的指针无效。
在您的情况下,mat3是一个自动变量,sumOfMat()会返回指向mat3的指针,sumOfMat()返回时该指针不存在。
解决问题的方法之一是将mat3定义为全局变量。

此外,我指出了您的代码的一个主要问题:

sumOfMat(int* m1,int* m2)的返回类型是指向整数(int *)的指针,当您返回类型为mat3的{​​{1}}时。
编译代码时我收到了很多警告。我纠正了他们中的大部分 修改后的代码:

int(*)[3]

答案 2 :(得分:0)

这是因为你要返回mat3,这是一个定义为

的局部变量
int mat3[3][3];

要更正此问题,请使用mat3动态分配malloc或将其作为out variable作为第三个变量传递给sumOfMat