0

「int e = 0;」を削除すると、cに次のプログラムがあります。私はセグフォルトを取得します、誰かが理由を知っていますか? それも使われてない?

2 つ目は、最初の 3 つの int を取得するための最良の方法は何ですか? memcpy を使用していますが、最初のものでは正しく動作しません。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int test()
{    
unsigned char string1[] = {0xce,0x01,0x00,0x00,0xe9,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x74,0x65,0x73,0x74};
//0xce,0x01,0x00,0x00 this should be the first int
//0xe9,0x00,0x00,0x00 Second int
//0x01,0x00,0x00,0x00 third int, the rest is the text "test"
    int e = 0;// when I comment this one I get Segmentation fault 
    unsigned int int1 = 0;
    unsigned int int2 = 0;
    unsigned int int3 = 0;
    int length = 0;
    int size = 0;
    size = sizeof(length);
    memcpy(&int1, string1, length); printf("%d\n",int1); //should be 461
    length += size;
    memcpy(&int2, &string1[length], length);  printf("%d\n",int2); //shoud be 233
    length += size;
    memcpy(&int3, &string1[length], length);  printf("%d\n",int3); //should be 1 
    length += size;
    printf("%s\n",&string1[length]);//text should be test

}

int main()
{
test();
}

「int e = 0;」の場合の出力は以下のとおりです。存在する

0
233
1
test

「int e = 0;」の場合の出力は以下のとおりです。コメントされています

0
233
1
Segmentation fault (core dumped)
4

3 に答える 3

3

の 3 番目の引数として、ゼロ、sizeof (length)次にを渡します。これは意図したものではない可能性があり、最後の 1 つは宛先に対して大きすぎます。2* sizeof(length)memcpy

(実際には長さではなくオフセットです)の代わりにsizeof (int1),sizeof (int2)を使用すると、問題は解消されます。sizeof (int3)length


Floris が指摘したよう%sに、printf 形式指定子で終端の NUL バイトを探しますが、それがないため、別の問題が発生することに注意してください。

于 2013-07-10T03:25:16.967 に答える
2

文字列を null で終了する必要があります。宣言するeと、たまたま文字列の直後のメモリ内の場所を占有し、null 終端を提供します。渡される文字列の最後の値として追加する必要があり'\0'、すべてうまくいきます...

于 2013-07-10T03:28:13.763 に答える
0

メモリ オーバーラン:

printf("%s\n",&string1[長さ])

文字列が \0 で適切に終了していません。e=0 は文字列を終了します。

さらに、サイズの代わりに長さを使用しています。

次のようにする必要があります。

int テスト()
{    
unsigned char string1[] = {0xce,0x01,0x00,0x00,0xe9,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x74,0x65,0x73,0x74,0x00};
//0xce,0x01,0x00,0x00 これは最初の int でなければなりません
//0xe9,0x00,0x00,0x00 秒の整数
//0x01,0x00,0x00,0x00 3 番目の整数、残りはテキスト「test」
    int e = 0;// これをコメントすると、セグメンテーション違反が発生します
    unsigned int int1 = 0;
    unsigned int int2 = 0;
    unsigned int int3 = 0;
    int 長さ = 0;
    int サイズ = 0;
    サイズ = sizeof(符号なし int);
    memcpy(&int1, string1, size); printf("%d\n",int1); // 461 にする必要があります
    長さ += サイズ;
    memcpy(&int2, &string1[長さ], サイズ); printf("%d\n",int2); // 233 にする必要があります
    長さ += サイズ;
    memcpy(&int3, &string1[長さ], サイズ); printf("%d\n",int3); // 1 である必要があります
    長さ += サイズ;
    printf("%s\n",&string1[length]);//テキストはテストする必要があります

}

0x00string1 での終了と、memcpy での長さではなくサイズの使用に注意してください。

于 2013-07-10T03:31:50.033 に答える