0

これがどのように機能するかわかりません。私は次のものを持っているとしましょう:

void print(char* str, int len)
{
    int i = 0;
    for (i=0; i<len; i++)
    {
        if (str[i]=='\0')
            printf(" ");
        else
            printf("%c", str[i]);
    }
    printf("\n\n");
}

char* sym4 = "=";
char str2[strlen(var)+strlen(sym4)];

unsigned long temp1 = 0x00000008;
unsigned char* nTableSize = (unsigned char*)&temp1;

memcpy(str2, var, strlen(var));
memcpy(str2+strlen(var), sym4, 1);
memcpy(str2+strlen(var)+1, nTableSize, 4);

print(str2, 5);
print(str2, 6);

それを実行すると、次の出力が得られます。

var=
var

明らかに何かがおかしくなっています (さらに、プログラムの残りの部分が台無しになっています)。nTableSize が正しく str2 にコピーされず、5 文字を印刷すると 6 文字とは異なる出力になるのはなぜですか?...

4

1 に答える 1

1

x86 や x86-64 などのリトル エンディアン アーキテクチャを使用していると仮定すると、4 バイト値 0x0000008 はメモリ内で bytes として表されます08 00 00 00。バイトを文字として出力しており、文字 8 はバックスペース文字の ASCII です'\b'

ターミナルにa を出力する\bと、ターミナル ドライバはカーソルを 1 文字後ろに移動しますが、実際には何も出力しません。次の文字を書き込むまでは、前に存在していた文字が上書きされます。

そのため、5 バイト"var=\b"を出力する"var="と、出力されてカーソルが=記号の下に残ります。しかし、6 バイト"var=\b "を出力すると、 が書き込まれ"var="、カーソルが 1 つ戻り、=がスペースで上書きされ、 が残ります"var "

出力を端末に出力する代わりにファイルにリダイレクトすると、代わりに生の08バイトが出力されます。

于 2012-10-28T03:58:42.537 に答える