質問
u32 iterations = 5;
u32* ecx = (u32*)malloc(sizeof(u32) * iterations);
memset(ecx, 0xBAADF00D, sizeof(u32) * iterations);
printf("%.8X\n", ecx[0]);
ecx[0] = 0xBAADF00D;
printf("%.8X\n", ecx[0]);
free(ecx);
非常に簡単に言えば、出力が次のようになるのはなぜですか?
0D0D0D0D
BAADF00D
ps: u32は、unsigned intの単純なtypedefです
編集:
- gcc 4.3.4でのコンパイル
- string.hが含まれています
解決
memsetの2番目のパラメーターはintとして入力されますが、本当に符号なし文字です。符号なし文字(最下位バイト)に変換された0xBAADF00Dは0x0Dであるため、memsetはメモリを0x0Dで埋めます。
他のヒント
memset()の2番目の引数は、intまたはu32ではなくcharです。 Cは、0xBAADF00D intを自動的に0x0D文字に切り捨て、要求されたとおりにメモリ内の各文字を設定します。
wmemset()で試しました。動作しているようです:
#include <stdlib.h>
#include <stdio.h>
#include <inttypes.h>
#include <wchar.h>
int main(void){
uint32_t iterations = 5;
uint32_t *ecx = (uint32_t*)malloc(sizeof(uint32_t) * iterations);
wmemset( (wchar_t*)ecx, 0xBAADF00D, sizeof(uint32_t) * iterations);
printf("%.8X\n", ecx[0]);
ecx[0] = 0xBAADF00D;
printf("%.8X\n", ecx[0]);
/* Update: filling the array with memcpy() */
ecx[0] = 0x11223344;
memcpy( ecx+1, ecx, sizeof(*ecx) * (iterations-1) );
printf("memcpy: %.8X %.8X %.8X %.8X %.8X\n",
ecx[0], ecx[1], ecx[2], ecx[3], ecx[4] );
}
memcpy(ecx + 1、ecx、...
を使用したトリックは、Linuxではここでは機能しません。 iterations-1
の代わりに1バイトのみがコピーされます。
所属していません StackOverflow