memmove不复制缓冲区的所有内容 - C.

时间:2013-10-20 23:05:52

标签: c malloc buffer printf memmove

我有以下代码,其中我正在尝试创建一个长度为7个字节的缓冲区,然后在网络字节顺序中放入一个整数以及缓冲区中的char数组,我不应该在结尾处使用Null字符我的sprintf()缓冲区,所以我使用memcpy()只复制7个字节。但是,我似乎在memcpy()之后获得了不同的缓冲区。

代码:

int num = 1234;
char *dummy = "bla";
int dummy_len = strlen(dummy);
int buffer_len = sizeof(int) + dummy_len;
char *buffer = malloc(buffer_len);
char *temp_buf = malloc(buffer_len);
size_t len = buffer_len;

sprintf(temp_buf, "%d%s",htonl(num),dummy); //preparing the temp_buf
memmove(buffer, temp_buf, len); 
printf("sizeof(temp_buf) = %d and sizeof(buffer) = %d\n",sizeof(temp_buf), sizeof(buffer));
printf("printing buffer = %s and temp_buf = %s\n", buffer,temp_buf);

我得到以下输出:

sizeof(temp_buf) = 4 and sizeof(buffer) = 4
printing buffer = -771489 and temp_buf = -771489792bla

2 个答案:

答案 0 :(得分:1)

使用sizeof(int)然后sprintf(...,"%d...是不连贯的。并非所有4字节整数都以十进制的4位数打印。

特别是,htonl(num)可能不会以4位十进制表示打印。因此,sprintf()溢出缓冲区temp_buf

你应该使用类似的东西:

uint32_t n = htonl(num);
memcpy(temp_buf, &n, sizeof(n));

答案 1 :(得分:1)

您不需要sprintf,只需直接复制数据。

int temp = htonl(num);
memmove(buffer, &temp, sizeof(temp));
memmove(buffer+sizeof(temp), dummy, strlen(dummy));