質問

ここでは、特定のシナリオとして不明な点(規約の範囲)。

を考慮するコード

#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プログラミング、ゴミ出しのことです。かを返します正しい結果です。では、"="を s.t=x;コピーの値xを入。イラストのtシャツです!

編集---

その後の実験

#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

として期待される。

役に立ちましたか?

解決

  

それは&quot; =&quot;行s.t = x; xの値をs.tにコピーしますか?

はい。

ところで、これはC ++です。 「」をパスしました関数への参照としてmainに対してローカルであり、関数を変更します。コピーではなく参照であるため、呼び出し元の「」に影響します。

他のヒント

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

最初のテストでは、 x の値を st コピーするようコンパイラーに指示しています。 -これは期待どおりに機能します。ローカル変数 x は範囲外になりますが、関数の外部で参照されることはありません-最初に含まれていたデータは main()の t メンバーにコピーされますのローカル変数 s 。代わりに次のように記述した場合、事実上同じになります。

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

2番目のテストでは、ポインターを別のポインターに割り当てます。両方のポインターはローカル変数として宣言されています。これは何の役にも立ちません- 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

読: デフォルトのコピーコンストラクタと代入演

なく提供する代入演算子は、struct_s_tい浅いコピーのすべての社員が割り当てられます。いものすべてを保存するのに_t_tによる価値、すべてのデータがコピーされる値です。

の問題で記述する場合_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;
}

この問題の発生の原因になるのは、間違いが破壊され末試験()である点がポインタが無効とさせていただきます。※

ETA:いままでの問題...

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

まっさせていただき、大変な問題です。何が起こったのかが作成したデータへのバッファへのポインタのアドレスs.tである。しかしいその後は再割り当てるポインタをポイントのx(この課題かも。tどうするか変更のポインタptポイント) その理由をこの出力は'と'ではどうするの読み込みuninitialisedのstruct.

あなたは正しい、行

s.t = x;

値をコピーします。

割り当ては、ある変数から別の変数に値をコピーします。元のローカル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はなくなっています。したがって、無効なメモリ位置への参照を効果的に持っています。このプログラムの動作は未定義です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top