2017-01-23 11 views
0

私は現在、Cでプログラミングする方法を学んでいます。今日はポインタで始めました。次のような状況に遭遇しました。私はプログラム参照される変数と異なるタイプのポインタ

#include<stdio.h> 

int main() { 

    int a; 
    double * p; 
    p = &a; 
    *p = 12.34; 
    printf("%d\n",a); 
    * (int *) p = 12.34; 
    printf("%d\n",a); 

    return 0; 
} 

をコンパイルするとき、それは

$ gcc zeigertypen.c 
zeigertypen.c: In function ‘main’: 
zeigertypen.c:7:7: warning: assignment from incompatible pointer type [-Wincompatible-pointer-types] 

と実行時に言って、私は出力

2061584302 
Speicherzugriffsfehler (Speicherabzug geschrieben) 

を取得し、エラーメッセージが

memory access error (core dumped) 
のようなもののためにドイツ語であります

ただし、if私は、コードの目的は、彼らが参照している変数とは異なるタイプのポインタに問題があることを実証することであるエラーが消え、出力が

0 
12 

ある*p = 12.34;行をコメントアウトします。私はC++を学ぶために使用している教科書によると、出力は

2061584302 
12 
+3

私は新しい教科書を手に入れました。それは、cヘッダをインクルードし、未定義の動作の出力を指示するように思われます。 – George

+0

これは実際にはCではなく、C++で、私は@Georgeでプログラミングしています。間違って申し訳ありません。 –

+1

まあ、私は本の年齢と妥当性を見て、それはあなたに嘘をついていて、[UB](https://en.wikipedia.org/wiki/Undefined_behavior)に関するセクションに移りますが、そうではありません。/ – George

答えて

5

p = &a;の動作は、実際に未定義であるべきです。

CもC++も、の型(intへのポインタ)をdoubleへのポインタとして再解釈することはできません。

(int*)pも同様の問題がありますが、それまでに損傷が行われています。

void*にキャストして元のタイプに戻すことができますvoid*:今のところ、これはポインタのタイプを別のタイプにキャストできる唯一のケースです。コードと

+0

'p'を' double * 'ポインタとして定義したので、 'p =&a'は定義されていませんか? –

+3

絶対に。あなたがそれを書くなら、コンパイラはあなたの猫を食べる権利を留保します。 (おそらく起こっているのは、* pがあなたのポインタ 'p'である' a 'の後にメモリを捨てていることです。 'double'はおそらくint型よりも大きな型です)。 – Bathsheba

+0

doubleの代わりにfloatを使用することで、実際にこのエラーを回避できます。しかし、もう一度、教科書はdoubleがintと同じサイズを持つとは仮定しなかった。だから、その本はまだ横たわっていると言うことができます。 –

0

、について説明:(あなたの教科書にACC)

#include<stdio.h> 

int main() { 

    int a; // size let say (2 byte or 4) 
    double * p; // it will point to continous memory of 8 byte 
    p = &a;  // Now because of this ,starting from first byte of a it will derefer 8 bytes (but Undefined behaviour acc to C standards) 
    *p = 12.34; // assigned to those 8 bytes 
    printf("%d\n",a); // first (2 or 4) bytes of that value in *p assignment as it starts from a 
    * (int *) p = 12.34; // now you type casted it to derefer 2 bytes so store 12 in those (2 or 4) bytes as int 
    printf("%d\n",a); // first (2 or 4) bytes of that value in *p assignment 

    return 0; 
} 

あなたはより多くのexplainationのコメントを必要とし、私に言わせれば。ありがとうございました。

+0

それはそうだった;)しかし、私はあなたが好きではないからではありません.Oの説明は、彼らの質問のようなオペレーションの出力を説明しているとは思えません。私はdvを取り消すでしょう。なぜなら、これが他人を助けるかもしれないopを助けるだろうと思うからです。 – George

+0

Lemme help!結局のところ私は初心者の助けが好きなので、私はずっと先生だったので、私はそれを助けるのが好きです@George –

+0

@Georgeどのようにこれは誰を助けるつもりですか? "説明"は正しくない... – Geoff

関連する問題