0

私はこの振る舞いを理解するのに本当に苦労しているので、誰かが状況に光を当てることができるかもしれません。メソッドから構造体へのポインターを返すことができず、後でそれを再利用できると期待できる理由がわかりません。

ご覧のとおり、このgenerateSmallMatrix()メソッドはint []配列を作成し、それをysmf構造体内に設定してから、mainに戻ります。次に、Mainはysmf *を取得し、printArrayを呼び出します(再度)。そして、3回目の試行では、配列を取得できなくなります。それは私を夢中にさせています。

私はEclipseデバッガーで、の場所がすべての呼び出しでmatrix->A同一であることを確認しました(0x7fffffffe180-したがって、Cポインターについて知っているすべての場合、そのintにアクセスする任意の形式が正しい値を返す必要があります-*(ax ++)またはax [i] )..しかしどちらもしません..

控えめに言っても非常にイライラするので、ここにコードがあります:

#include <stdio.h>
#include <stdlib.h>

typedef struct sparseMatrix
{
    int* A;
} ysmf;

void printArray(int* ax, int length) {
    int i = 0;
    for (i = 0; i < length; i++) {
        printf("%i,", ax[i]);
    }
    printf("\n");
}

ysmf* generateSmallMatrix()
{
    ysmf *matrix = malloc(sizeof(ysmf));

    int a[] = {1,2,3,9,1,4};
    printArray(a, 6);                   // returns 1,2,3,9,1,4,
    matrix->A = a;
    printArray(matrix->A, 6);           //returns 1,2,3,9,1,4,
    //printArray(matrix->A, 6);

    return matrix;
}


int main(void) {
    ysmf* matrix = generateSmallMatrix();
    printArray(matrix->A, 6);           //returns 1,6,-7856,32767,1,4,
    return EXIT_SUCCESS;
}

コメントを挿入したところに問題が発生していることがわかります。

これはおそらく私が見逃してはならない完全に基本的なものであることを私は知っています。

4

3 に答える 3

3

はローカル配列であり、関数が終了aするとその有効期間が終了するためです。generateSmallMatrix()その後にアクセスすると、未定義の動作が発生します。

于 2012-06-25T23:22:42.647 に答える
1

この行

ysmf *matrix = malloc(sizeof(ysmf));

ysmf構造体(この場合は単なるintポインター)に十分なスペースのみを割り当てます。それで、あなたは行って、それを「a」に向けます。

matrix->A = a;

問題は、aがスタック上にあることです。したがって、現在はこのメモリアドレスを指していますが、関数を終了すると、メモリは配列用に予約されなくなります。

代わりに、「a」のメモリをマロックし、構造体をその方向に向ければ、問題ありません。

于 2012-06-25T23:33:35.640 に答える
1

これを試して...

ysmf* generateSmallMatrix()
{
    ysmf *matrix = malloc(sizeof(ysmf));

    int a[] = {1,2,3,9,1,4};
    printArray(a, 6);

    matrix->A = malloc(sizeof(int) * 6);
    memcpy(matrix->A, a, sizeof(int) * 6);
    printArray(matrix->A, 6);

    return matrix;
}

これで、generateSmallMatrix関数の外で、正しい値を出力できるはずです。ただし、mallocされたものは必ず解放してください。

int main(void) {
    ysmf* matrix = generateSmallMatrix();
    printArray(matrix->A, 6);

    free(matrix->A);
    free(matrix);

    return EXIT_SUCCESS;
}

お役に立てれば。

于 2012-06-25T23:37:13.800 に答える