0

これは、私が長い間(範囲に関して)明確にしてこなかった特定のシナリオです。

コードを検討する

#include <stdio.h>


typedef struct _t_t{
    int x;
    int y;
} t_t;

typedef struct _s_t{
    int a;
    int b;
    t_t t;
}s_t;

void test(s_t & s){
    t_t x = {502, 100};
    s.t = x;
}


int main(){
    s_t s; 
    test(s);

    printf("value is %d, %d\n", s.t.x, s.t.y);
    return 0;
}

出力は

value is 502, 100

私にとって少し混乱しているのは、次のことです。宣言

t_t x

関数テストのスコープで宣言されています。だから私がCプログラミングについて読んだことから、それはこの範囲外のガベージであるはずです。それでも正しい結果を返します。st = x; 行の「=」が原因でしょうか。x の値を st にコピーしますか?

編集 - -

いくつかの実験の後

#include <stdio.h>


typedef struct _t_t{
    int x;
    int y;
} t_t;

typedef struct _s_t{
    int a;
    int b;
    t_t t;
}s_t;

void test(s_t & s){
    t_t x = {502, 100};
    t_t * pt = &(s.t);
    pt = &x;
}


int main(){
    s_t s; 
    test(s);

    printf("value is %d, %d\n", s.t.x, s.t.y);
    return 0;
}

実際に出力する

value is 134513915, 7446516

予想通り。

4

5 に答える 5

7

st = x; 行の「=」が原因でしょうか。x の値を st にコピーしますか?

はい。

ちなみにC++です。関数への参照として "s" local を main に渡し、それを変更します。これはコピーではなく参照であるため、呼び出し元の "s" に影響します。

于 2009-09-16T22:13:42.330 に答える
6
   t_t x = {502, 100};
   s.t = x;

最初の testでは、コンパイラにの値をコピーするように指示しています。これは期待どおりに機能します。ローカル変数はスコープ外になりますが、関数の外で参照されることはありません。最初に含まれていたデータは、のローカル変数のメンバーにコピーされます。代わりに次のように記述しても、実質的に同じになります。xs.txtmain()s

t_t x = {502, 100};
s.t.x = x.x;
s.t.y = x.y;

2 番目の testでは、ポインターを別のポインターに割り当てます。どちらもローカル変数として宣言されています。これは何の役にも立ちません - の値は初期化されs.tないままです。あなたがそれに従うのを助けるために、私はコードに注釈を付けました:

t_t x = {502, 100}; // local variable x initialized with 502, 100
t_t * pt = &(s.t); // local variable pt initialized with ADDRESS OF s.t
pt = &x; // local variable pt re-assigned to hold address of local variable x

// local variables go out of scope, output parameter s remains unmodified
于 2009-09-16T22:16:20.393 に答える
0

割り当ては、ある変数から別の変数に値をコピーします。したがって、元のローカルxはなくなりましたが、sにコピーがあります。

xにポインタを割り当てたばかりの場合は、まったく異なります。

typedef struct _s_t{
        int a;
        int b;
        t_t* t;
}s_t;

void test(s_t & s){
        t_t x = {502, 100};
        s.t = &x;
}

次に、問題が発生します。アドレスはxしかありませんが、xはなくなります。したがって、無効なメモリ位置への参照が事実上あります。その場合、このプログラムの動作は未定義になります。

于 2009-09-16T23:42:19.270 に答える
0

そうです、ライン

s.t = x;

値をコピーします。

于 2009-09-16T22:13:53.457 に答える