0

私は 3 年前に C プログラミング言語を学びましたが、Java と C# の経験を経て 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

2

自動変数 へのポインターを返さない:

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

変数iは一度返されると存在しないfため、変数へのポインターは無効になります。
あなたの場合mat3は自動変数であり、一度戻ると存在しないsumOfMat()ポインターを返します。 あなたの問題の解決策の1つは、グローバル変数として定義することです。 mat3sumOfMat()
mat3

さらに、あなたのコードの 1 つの大きな問題を指摘しました。

戻り値の型はsumOfMat(int* m1,int* m2)、整数 ( int *)へのポインターmat3であり、どちらが型であるかを返しています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];

これを修正するには、動的割り当てをmat3使用するか、関数内の3 番目の変数としてmalloc渡します。out variablesumOfMat

于 2013-09-17T17:29:21.753 に答える