0

我三年前学习了 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 

演示

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

4

3 回答 3

5

线

int mat3[3][3];

在堆栈上分配您的二维数组

您正在返回一个指向该数组的指针。

return mat3;

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

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

于 2013-09-17T17:28:28.703 回答
2

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

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

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

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

返回类型 ofsumOfMat(int* m1,int* m2)是指向 integer( int *) 的指针,而您返回mat3的是 type int(*)[3]
我在编译你的代码时收到了很多警告。我纠正了大部分。
修改后的代码:

#include <stdio.h>
void printMat(int *m);
int* sumOfMat(int* m1,int* m2);
int mat3[3][3];

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,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[0];
}

void printMat(int *m)
{
    int row;
    for (row=1;row<=9 ;row++)
        {
            printf("%d\t",*m++);
            if(row%3 == 0)
                printf("\n");
        }
   /* {
        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[0][0],&mat2[0][0]);
printMat(x);   // this call is providing me some garbage values at some locations.
return 0;
}  
于 2013-09-17T17:31:51.670 回答
0

这是因为您要返回mat3的是定义为的局部变量

int mat3[3][3];

要纠正这个问题,要么动态分配mat3using ,要么malloc将其作为out variable函数中的asumOfMat作为第三个变量传递。

于 2013-09-17T17:29:21.753 回答