2012-02-17 13 views
0

私は、文字ポインタとその文字列を入力するために渡される関数を渡すプログラムを持っている。しかし、私はデータが切り捨てられていることに気づいた。 gdbを使って調べると、ポインタのサイズに違いがあるようです。関数の呼び出し時にポインタのサイズが変更される(gdbを使用してチェックされる)

int main(void) { 
    unsigned char *test_char; 

    test_char = (unsigned char *)malloc(sizeof(unsigned char) * 6); 
    memset(test_char, 0x00, sizeof(unsigned char) * 6); 

    functionToPopulate(test_char); 
} 

void functionToPopulate(unsigned char *test_char) { 
    snprintf(test_char, sizeof(test_char), "%u%s%u", 20, ":", 30); 
} 

この場合、memsetの前にgdbを使用し、test_charの値を出力しました。それは言う(6)。 snprintf実行中と実行後に、私はgdbを使ってtest_charの値を出力しました。それは言う(4)。しかし、戻ってくると、値は(6)と再び表示されます。ただし、データは既に切り捨てられています。 「20:30」ではなく「20:」となります。

+0

ポインタのサイズは、ポインターのサイズと同じではありません。ポインタのサイズは変更できません。 – jamesdlin

答えて

1

functiontopopulateを呼び出す前に、malloc sizeof(unsigned char) * 6を呼び出して6を返します。sizeof(unsigned char)は1 * 6 = 6. sizeof(test_char)関数の中で、(unsigned char *)のサイズポインタは4です。cで配列を渡す必要がある場合は、配列のサイズを渡す必要があります.cはそれを維持しないためです。

+0

今すぐ試してみます。 :) – user1215353

+0

また、 'sizeof(char)'は* always * 1なので、その2つのインスタンスを削除してコードをより明確にすることができます。また、Cで 'malloc'の戻り値を決して*キャストしないでください。 –

関連する問題