2

可変長配列を構造体に格納したいので、この目的のためにポインターを使用します。ただし、格納された配列を取得すると、間違った値が返されます。以下の例では、出力 "1 0" が得られますが、出力 "1 2" が期待されます。

#include <stdio.h>

typedef struct Flexibility {
    int *flex;
} Flexibility;

Flexibility calculateFlexibility()
{
    int a[2];
    a[0] = 1;
    a[1] = 2;

    Flexibility f;
    f.flex = a;
    return f;
}


void main()
{
    Flexibility f;
    f = calculateFlexibility();

    int i;
    for(i = 0; i < 2; i++)
    {
        fprintf(stdout, "%i ", *(f.flex + i));
    }

}
4

1 に答える 1

4

afunctionに一時変数を作成しcalculateFlexibility、次に変数へのポインターを格納しますf.flexが、関数が終了した後はaメモリから消えているため、f.flexポインターはどこにも指していません

本当に可変長にしたい場合は、次のようにする必要があります。

Flexibility calculateFlexibility()
{
    Flexibility f;
    f.flex = (int*)malloc(....);
    return f;
}

そしてプログラムの最後に:

free(f.flex);

malloc の適切な引数については、http: //en.cppreference.com/w/c/memory/mallocを読むことをお勧めします。

于 2013-10-18T01:37:20.560 に答える