2012-05-09 6 views
0

にこのコード渡されたポインタを通じて構造体のメンバを変更する:私はこのコードを実行することだった場合例えば機能

struct test{ 
    int ID; 
    bool start; 
}; 

struct test * sTest; 

void changePointer(struct test * t) 
{ 
    t->ID = 3; 
    t->start = false;  
} 

int main(void) 
{ 
    sTest->ID = 5; 
    sTest->start = true; 
    changePointer(sTest); 
    return 0; 
} 

は、出力は何でしょうか? (つまり、このようなポインタを渡すと、参照が変更されるのか、それとも単なるコピーなのか)

ありがとうございます!

+0

出力はありません。 – MByD

+0

私が知っているのは、理論がどのように働いているのか疑問に思っていたテストコードです。 – Davey

+1

この質問に書かれているように、組み込みシステムプログラミングに関する言及はありません.Cのポインタに関する質問だけです。埋め込みタグを削除 –

答えて

2

プログラムには出力がないため、出力されません。

また、sTestポインタは、有効なメモリを指すように初期化されないため、結果は完全には定義されません。このプログラムは未定義の動作を引き起こし、実行時にクラッシュする可能性があります。

ポインタタイプstruct testの有効なオブジェクトを指すように初期化された IF main()の終わりに、ID 3.変更がchangePointer()内で行われるであろうように、その構造体のフィールドである変更されたであろうmain()で行われた変更と同じメモリ上で行われます。

簡単な修正は次のようになります。C99はtrueキーワードを持っていない前に

int main(void) 
{ 
    struct test aTest; 
    sTest = &aTest; /* Notice the ampersand! */ 
    sTest->start = true; 
    changePointer(sTest); 

    return 0; 
} 

またそのCに注意してください。あなたのコードは、あなたが構造を保存するためのメモリを割り当てていないので、クラッシュしてしまいます

+0

行を変更してください*** sTest = aTest ***あなたのコードの***行は*** sTest =&aTest ***最初のものはコンパイラのエラーを返します.. – Krishnabhadra

+0

また、真または偽と一緒に、Cでもブールデータ型はありません。 – Krishnabhadra

+0

+1私の答えはあなたのために削除されました - しかし、C99以上は* bool '、' true'、 'false'(7.16)のようになります。 – justin

0

1)まず最初は..あなたは

sText = malloc(sizeof(struct test)); 

2)クラッシュを修正した後、あなたが渡すことができます構造体ポインタと変更を追加する必要がありますあなたはchangePointer機能で作ることはあなたが必要なのですか、なぜ唯一の問題がある

+0

C.での悪い危険な練習であるmalloc()の結果をキャストするための教示のためのDownvote [http]この[http://c-faq.com/malloc/mallocnocast.html]と[this](http: //stackoverflow.com/questions/1565496/specifically-whats-dangerous-about-casting-the-result-of-malloc)。 – Lundin

+0

うわー、私はmallocとのキャストを使うことは決して悪い練習ではないことを知りませんでした..情報をありがとう..私はdownvoteを受け入れます..私の答えを編集しました.. – Krishnabhadra

+0

私は大学でmallocで型キャストを使うように教えられました..ここにある機関がこの知識を取得したとは思わないでください。 – Krishnabhadra

0

..メインとvizeversaに

3を反映します)しかし、あなたは何を印刷していないので、あなたのプログラムに任意の出力がある文句を言いませんグローバルネームスペース内のテストポインタ?次に、メモリ割り当て操作がないことです。関数の入力パラメータとしてポインタがあります。したがって、それが指す構造は "changePointer"で変更されます。