2011-10-18 38 views
1

私はこれに質問を投稿しましたが、代わりにmemcmp()関数を使うと考えました。 Writing data to memory in C++C++のメモリにデータを書き込む

int x = 1; 
int fileptr = 0; 
void *data = malloc(4096); 
memcpy((int *)data+fileptr, &x, sizeof(int)); 

は、それからバック

int y; 
fileptr = 0; 
memcpy(&y, (int *)data+fileptr, sizeof(int)); 
cout<<y; 

このように、私は、変数yの異なる出力(一部の長い整数値)を取得値を読み取ります。すぐに助けてください。

+2

ようこそスタックオーバーフロー!あなたの質問は何ですか? –

+0

ここには 'memcmp'の使用はありません。 *あなたがこのソリューション*にどのような問題をもたらしたかを説明すれば、人々は、ポインタをマイクロ管理することなく、毎回未定義のビヘイビアを実行するよりはるかに優れたソリューションを見つける手助けをすることができます。 –

+0

あなたは 'data'を初期化しませんでした。あなたはランダムなメモリアドレスに書き込みます。 –

答えて

4

ポインタdataを宣言しますが、決して初期化しません。したがって、その動作は未定義です。あなたはdataをどこかに向けなければなりません。つまり、メモリを割り当てます。 hereを参照してください。

+0

私はコードでそれを初期化しました。 data = malloc(4096); – Akshay

+0

@Akshay:その場合、あなたは何かがひどく間違っている。あなたのプログラムをもう一度見てから、コンパイルしてもう一度実行してください! – Nawaz

+0

データの型キャストに問題はありますか? 文字は正しく表示されていますが、整数は表示されません。 intは4バイトなので、私はそこで何かが間違っているかもしれないと思った。 – Akshay

0

除外するコードがない限り、dataは決して初期化されないため、ランダムな場所を指します。あなたのアプリケーションは完全にクラッシュしていないので、おそらく(多少)幸運になり、dataで終了し、他のコードによって書き込まれたスタック上の場所を指しているでしょう。したがって、価値の変化。

書き込みする前にdataのメモリを割り当ててください。これは発生しません。

0

データ用の記憶域を割り当てられていないので、そこにintデータをコピーすると、スタックが破損して問題が終了することはありません。

あなたはdataためのメモリを割り当てられていないとして、実際に、未定義の振る舞いを呼び出す

int x = 1; 
void *data=new int(); 
memcpy(data, &x, sizeof(x)); // never use the type use the var - more resilient to change 
+0

ここでの問題は、データの型がvoidであると私はint型、char型、実数のミックスを保存しなければならないことです。 私はデータ=新しいint()を使用することはできません; – Akshay

0

ような何かをしたい場合があります。それはxのビットパターンをどこに格納すべきですか?

メモリを割り当てて(mallocを使用して)、まだ間違った出力が得られた場合は、何かひどく間違ったことをしています。プログラムを再度見て、コンパイルしてもう一度実行してください。出力は1以外にはできません。言葉による鉱山(上記のリンクで)単語を使用してプログラムを比較し、あなたが不足しているものがあるかどうかを確認

:これを参照してください。

+1

どうもありがとう...私は、不要なコードをコメント解除し、それが正常に – Akshay

+0

@Akshayを走った:私はあなたに言った参照してください、あなたは間違ってやっているものがあります。今あなたが出力に影響する、いわゆる不要なコードで何をしているのか見てみましょう。 – Nawaz