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”?我仍然不确定使用指针算术和缓冲区。
此致
答案 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
strcpy(buff+5, &str);
您正在写入已分配的buff字节。这会导致内存损坏。
答案 1 :(得分:1)
应该是:
strcpy(buff + sizeof id + sizeof str_len, str);
/* ^^^^ no '&'! */
str
已经是一个指针。相比之下,&str
是指针的地址,这不是您所追求的。
您还需要在缓冲区中为两个初始变量腾出空间。