4
 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はunsignedintの単純なtypedefです

編集:

  • gcc4.3.4でコンパイルする
  • string.hが含まれています
4

4 に答える 4

11

memsetの2番目のパラメーターはintとして入力されますが、実際にはunsignedcharです。unsigned char(最下位バイト)に変換された0xBAADF00Dは0x0Dであるため、memsetはメモリを0x0Dで埋めます。

于 2009-09-13T21:20:09.357 に答える
2

memset()の2番目の引数は、intまたはu32ではなくcharです。Cは、0xBAADF00D intを0x0D文字に自動的に切り捨て、要求に応じて各文字をメモリに設定します。

于 2009-09-13T21:20:29.213 に答える
2

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] );
}
于 2009-09-13T22:15:40.237 に答える
0

ここでのトリックmemcpy( ecx+1, ecx, ...はLinuxでは機能しません。の代わりに1バイトのみがコピーされますiterations-1

于 2019-04-19T13:43:16.023 に答える