Cの可変範囲を特定の問題
-
07-07-2019 - |
質問
ここでは、特定のシナリオとして不明な点(規約の範囲)。
を考慮するコード
#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はなくなっています。したがって、無効なメモリ位置への参照を効果的に持っています。このプログラムの動作は未定義です。