【问题标题】:memmove not copying all the content of buffer - Cmemmove 没有复制缓冲区的所有内容 - C
【发布时间】:2013-10-20 23:05:51
【问题描述】:

我有以下代码,我试图在其中创建一个长度为 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

【问题讨论】:

    标签: c malloc buffer printf memmove


    【解决方案1】:

    不需要sprintf,直接复制数据即可。

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

    【讨论】:

      【解决方案2】:

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

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

      你应该使用类似的东西:

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

      【讨论】:

      • 是的,我刚刚使用了 len = 13 并且缓冲区内容是相同的。好的,有没有另一种方法可以将我的 int 转换为网络字节顺序,同时保持 4 字节的大小?
      • @ZahaibAkhtar 如果您不想获取可打印的字符串,那么memcpy() 应该可以正常工作。如果您出于某种原因需要获取可打印的字符串或将自己限制为十进制数字,则不可能通过计数参数来表示范围从 -2^31 到 2^31-1 的字符串中的整数0000 到 9999。
      • 是的,您的建议是正确的,@Chris Olsen 的建议也是正确的。这增加了我的知识!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-26
      • 1970-01-01
      • 1970-01-01
      • 2021-12-10
      • 1970-01-01
      • 1970-01-01
      • 2015-08-27
      相关资源
      最近更新 更多