0
int main(int argc, char **args) {
    unsigned char* str = "hallo";
    printf("String: %s\n",str);
    uint8_t aktion, id;
    uint32_t str_length;
    aktion = 1;
    id = 4;
    str_length = strlen(str)+1;

    unsigned char *buff;    
    buff = (unsigned char*) calloc(1,str_length+6);
    memcpy(buff, &id, sizeof(id));
    memcpy(buff+sizeof(id), &str_length, sizeof(str_length));
    strcpy(buff+sizeof(id)+sizeof(str_length), str);
    printf("Buffer+5: %s\n",buff+5));
    memcpy(buff+sizeof(id)+sizeof(str_length)+str_length, &aktion, sizeof(aktion));
    return 0;
}

出力「ハロー」が得られないのはなぜですか? ポインター演算とバッファーの使用についてはまだ確信が持てません。

よろしく

4

2 に答える 2

2
uint32_t str_length;
aktion = 1;
id = 4;
str_length = strlen(str)+1;

unsigned char *buff;    
buff = (unsigned char*) calloc(1,str_length);

Cでmalloc/callocのリターンポインタをキャストしないでください。

あなたのbuffサイズは6です

memcpy(buff, &id, sizeof(uint8_t));

ここに1バイト書きました

memcpy(buff+1, &str_length, sizeof(uint32_t));

ここに4バイトを書きました:

これは、割り当てられた6バイトのうち5バイトを使い果たしたことを意味しますbuff

strcpy(buff+5, &str);

あなたはbuffに割り当てられたバイトを超えて書いています。これにより、メモリが破損します。

于 2012-05-19T23:25:42.507 に答える
1

そのはず:

strcpy(buff + sizeof id + sizeof str_len, str);
/*                                        ^^^^   no '&'!  */

strすでにポインタです。対照的に、&strはポインタのアドレスであり、それはあなたが求めているものではありません。

また、2つの初期変数用にバッファーにスペースを空ける必要があります。

于 2012-05-19T23:23:55.747 に答える