char缓冲区中有很多缓冲区

时间:2012-05-19 23:09:39

标签: c pointers char buffer void

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;
}

为什么我没有输出“hallo”?我仍然不确定使用指针算术和缓冲区。

此致

2 个答案:

答案 0 :(得分: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个字节:

表示您为buff

分配的6个字节中的5个字节已用尽
strcpy(buff+5, &str);

您正在写入已分配的buff字节。这会导致内存损坏

答案 1 :(得分:1)

应该是:

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

str已经是一个指针。相比之下,&str是指针的地址,这不是您所追求的。

您还需要在缓冲区中为两个初始变量腾出空间。