4

だから私は unsigned char * を返すメソッドを持っています

unsigned char* someMethod(num)
unsigned short num;
{
    //do some stuff with num and change values of a
    unsigned char * a = (unsigned char*) malloc(4);
    printf("a0 is %x\n",a[0]);
    printf("a1 is %x\n",a[1]);
    printf("a2 is %x\n",a[2]);
    printf("a3 is %x\n",a[3]);
    return a;
}

someMethod(128) を呼び出したとき:

unsigned char* s = someMethod(128);
printf("s0 is %x\n",s[0]);
printf("s1 is %x\n",s[1]);
printf("s2 is %x\n",s[2]);
printf("s3 is %x\n",s[3]);

それは印刷されます

a0 is 30
a1 is 1
a2 is 31
a3 is 30
s0 is 30
s1 is 14
s2 is ffffff9d
s3 is 0

s = someMethod(128) を割り当てるので、まったく意味がありません。a と s が同じ値であってはいけませんか?!? どんな助けでも大歓迎です。ありがとうございました!

4

2 に答える 2

1

で印刷している%x場合、printf()関数はint. int32 ビット コンピュータの は 4 バイト長です。したがって、2 番目、3 番目、4 番目は領域の外側と内側printf()両方を読み取ります。malloc した領域以外の領域が常に変更されないことは期待できません。malloc()

解決策は、パッドを入れることです。sizeof(int)現在必要なものよりも数バイト多く、おそらくそれ以上の mallocを実行します。


解決策 2:に渡す前に最初にs[i]型 キャストします。intprintf()

于 2012-11-30T02:17:39.493 に答える
1

@ gl3829 のコメントを参照して、私は

unsigned char *a = malloc(4 * sizeof(*a))

サイズが「自動的に」正しくなるようにします。

someMethodさらに重要なことは、実際に何かを割り当てる前に、割り当てられた配列の値を出力することが問題だと思います。これにより、未定義の動作が呼び出され、任意の結果が得られます。印刷する前に何かを保存してみてください。

sunsigned charを 16 進数で出力する場合、正しい書式指定子は%hhxです。間違った指定子を使用すると、未定義の動作が発生する可能性もあります。

于 2012-11-30T01:59:49.657 に答える