2017-10-21 1 views
0

式の結果(int)をintポインタに設定しようとしています。私が次のことをしている場合:memcpyを使ってポインタへの式の値のコピーに関する問い合わせ

int* a = new int; 
memcpy(a, (int*)(3+4), sizeof(int)); 

私はそれが予想される動作の周りに私の頭をラップするのに問題があります。 Wllは値7を期待通りにコピーします。または、何らかの未定義の動作が発生します

+2

メモリアドレス「7」に有効な「int」値が存在する可能性は低いです。これは '(int *)(3 + 4)'がナンセンスであると言っていることの長い言い方です。このコードは未定義の動作を示します。それを '* a = 3 + 4;にする。 –

+2

アドレス0x0000007は、システムの予約されたメモリ領域の途中にある。セグメンテーションフォールト以外にどのような価値があるかを誰が知っているか。なぜ、C++の割り当てを 'new'とC' memcopy'と混同していますか? –

答えて

3

いいえ、これで値7がコピーされません。代わりに、未定義の動作が発生します。

sourceで指定されたメモリアドレスに移動し、sizeバイトをコピーしてください。 (int *)(3 + 4)を書くと、数値が7のポインタが得られます。つまり、メモリアドレス7を指していることを意味します。ブロック137の家137には、氏と夫人137という人が住むとは思わないでしょう。メモリアドレス7の内容が数値7であるとは限りません。

実際には、メモリアドレス7は読み書き可能な記憶域ではありません。あなたは本質的に型キャストで住所を "作り上げ"ました。そこに何か意味があると信じる理由はありません。手紙に偽の郵送先を書き留めて、それをメールにドロップすると想像してください。それが実際に誰にでも届く確率はスリムであり、それが彼らに届くと、なぜ彼らに連絡しているのか分かりません。

言語の観点からは、これは未定義の動作であり、ほとんどのシステムではsegfaultになります。

関連する問題