2017-12-21 12 views
-1

ポインタの文字を連結し、そのサイズを返す必要があるが、文字の合計を得ることができない関数がある:Cの符号なし文字のポインタの文字数

int function(unsigned char * dest) 
{ 
    *dest++ = 0x12; 
    *dest++ = 0x34; 
    *dest++ = 0x56; 
    *dest++ = 0x78; 
    *dest++ = 0x9A; 
    *dest++ = 0xBC; 
    *dest++ = 0xDE; 
    *dest++ = 0xFF; 

    *dest++ = '\0'; 

    size_t len = strlen((char*) dest); 

    return len; 
} 

これは、私はそれを占有する方法:

unsigned char buffer[512]; 
int buffer_len = function(buffer); 

問題はbuffer_lenは常にゼロであるということであると私はあなたがに着く16

+3

'strlen()'は、 '\ 0'ターミネータを越えていない文字列の先頭へのポインタを期待しています... –

+2

' function'が返った後に 'strlen(buffer)'を呼び出します。あなたは何から得ますか?次に 'dest 'をどのように使用しているかをもう一度見てください。特に' ++ 'が何をするのかを考えてください。 – zwol

+0

'strlen((char *)dest)'を呼び出すと、 'dest'は追加されたすべての文字の直後を指します。それを変更する前に 'dest'をコピーし、その2番目のポインタのために' strlen() 'を呼び出します。 – Scheff

答えて

4

ことを期待10コールの場合、destは、文字列の末尾のヌルバイトを超えた1つの要素を指しています。これは、バイトとその後のバイトが初期化されていないので、undefined behaviorを呼び出します。

あなたはdestの元の値を追跡し、減算する必要があります。

int function(unsigned char * dest) 
{ 
    unsigned char *start = dest; 
    *dest++ = 0x12; 
    *dest++ = 0x34; 
    *dest++ = 0x56; 
    *dest++ = 0x78; 
    *dest++ = 0x9A; 
    *dest++ = 0xBC; 
    *dest++ = 0xDE; 
    *dest++ = 0xFF; 

    *dest = '\0'; 

    return dest - start; 
} 
1

あなたのコードの動作は未定義です。

パラメータとして渡した入力ポインタdestを変更しています。

strlen((char*) dest)を呼び出した時点で、destは、追加したNULを1つ超えています。それで、の未初期化要素を読み取るので、strlenの動作を予測することはできません。

最も簡単な修正は、関​​数を入力するときにdestのコピーをとり、最終値destからその元の値を差し引くことです。これは文字列の長さになります。

関連する問題