user-0 提问:  memcpy内存复制

回复:
user: user-1
content: 引用 8 楼 Armin_ 的回复:[quote=引用 7 楼 jianwen0529 的回复:] [quote=引用 4 楼 Armin_ 的回复:] 目的是通过socket send()发送出去，然后在另一端再解析。 有复杂的原因我必须这样先转化然后再解析。我的目的就是想把他们变成一段连续的内存。  sprintf(buf, "%d", c); //socket.send(buf) //socket.revc(buf) int i = atoi(buf);  这样子使用会不会好一些？  或者如同6L的，不要用strlen，依据revc参数中接收到的字节数判断[/quote] 我用strlen只是想判断一下有多少个字节数。 突然又发现一个问题。 如果这样char buf[1024]; strlen(buf) 为什么结果是1呢。[/quote]  一个int变量4个字节，值为1，二进制是0x00000001，小端字节序，在内存中反过来存储：0x01 0x00 0x00 0x00,用strlen去判断，结果是1

user: user-0
content: 引用 10 楼 user-4 的回复:strlen是检测到0为止  所以你要看这些数据在内存二进制是什么，然后就知原因了 恩恩 找到原因了谢谢！

user: user-0
content: 引用 7 楼 jianwen0529 的回复:[quote=引用 4 楼 Armin_ 的回复:] 目的是通过socket send()发送出去，然后在另一端再解析。 有复杂的原因我必须这样先转化然后再解析。我的目的就是想把他们变成一段连续的内存。  sprintf(buf, "%d", c); //socket.send(buf) //socket.revc(buf) int i = atoi(buf);  这样子使用会不会好一些？  或者如同6L的，不要用strlen，依据revc参数中接收到的字节数判断[/quote] 我用strlen只是想判断一下有多少个字节数。 突然又发现一个问题。 如果这样char buf[1024]; strlen(buf) 为什么结果是1呢。

user: user-2
content: 引用 4 楼 Armin_ 的回复:目的是通过socket send()发送出去，然后在另一端再解析。 有复杂的原因我必须这样先转化然后再解析。我的目的就是想把他们变成一段连续的内存。  sprintf(buf, "%d", c); //socket.send(buf) //socket.revc(buf) int i = atoi(buf);  这样子使用会不会好一些？  或者如同6L的，不要用strlen，依据revc参数中接收到的字节数判断

user: user-3
content: strlen使用对象是字符串，对其他类型的使用结果不一定相同； 另外， 如果想把其他类型的数据拷贝到buf(char类型），直接memcpy即可，如果将buf的数据换回其他类型，直接反向memcpy，即将memcpy的前两个参数互换一下；或者直接类型转换，如下： #include <stdio.h> #include <string.h>  int main(void) {     int num = 5, tmp, num2;     char buf[32];      memcpy(buf, &num, sizeof(num));      memcpy(&tmp, buf, sizeof(tmp));     num2 = *(int *)buf;     printf("tmp = %d\n", tmp);     printf("num2 = %d\n", num2);      return 0; }

user: user-4
content: strlen是检测到0为止  所以你要看这些数据在内存二进制是什么，然后就知原因了

user: user-1
content: strlen是针对字符串的函数 在发送端是怎么序列化的，接收端就怎么反序列化。

user: user-0
content: 引用 3 楼 jianwen0529 的回复:[quote=引用 2 楼 Armin_ 的回复:] [quote=引用 1 楼 jianwen0529 的回复:] int float double 的存储结构导致的  int的存储的是 0x00000001 那么复制到buf就是 1000 sizeof(int) 大小，这里假定是4字节  strlen是依据 '\0' 结束的，那么计算出来就是1了  至于float double（3.0,5.0）第一个byte就是 0 了，那么长度自然是 0 平台不懂，存储的结构并不一致，不便多讨论，你换个数字可能就不一样的结果了  memcpy是按字节拷贝的，所以你以上的用法是有明显缺陷的，不建议这样子使用 尽量只对一块整体的内存或者char*使用 谢谢！ 那我应该怎样将这这几种数据类型拷贝到char[]中？[/quote]  首先你拷贝到char[]的目的是什么？ 知道目的，才能设计过程。 这种法子不是不行，只是得看你这样子做的目的了[/quote]  目的是通过socket send()发送出去，然后在另一端再解析。 有复杂的原因我必须这样先转化然后再解析。我的目的就是想把他们变成一段连续的内存。

user: user-2
content: 引用 2 楼 Armin_ 的回复:[quote=引用 1 楼 jianwen0529 的回复:] int float double 的存储结构导致的  int的存储的是 0x00000001 那么复制到buf就是 1000 sizeof(int) 大小，这里假定是4字节  strlen是依据 '\0' 结束的，那么计算出来就是1了  至于float double（3.0,5.0）第一个byte就是 0 了，那么长度自然是 0 平台不懂，存储的结构并不一致，不便多讨论，你换个数字可能就不一样的结果了  memcpy是按字节拷贝的，所以你以上的用法是有明显缺陷的，不建议这样子使用 尽量只对一块整体的内存或者char*使用 谢谢！ 那我应该怎样将这这几种数据类型拷贝到char[]中？[/quote]  首先你拷贝到char[]的目的是什么？ 知道目的，才能设计过程。 这种法子不是不行，只是得看你这样子做的目的了

user: user-0
content: 引用 1 楼 jianwen0529 的回复:int float double 的存储结构导致的  int的存储的是 0x00000001 那么复制到buf就是 1000 sizeof(int) 大小，这里假定是4字节  strlen是依据 '\0' 结束的，那么计算出来就是1了  至于float double（3.0,5.0）第一个byte就是 0 了，那么长度自然是 0 平台不懂，存储的结构并不一致，不便多讨论，你换个数字可能就不一样的结果了  memcpy是按字节拷贝的，所以你以上的用法是有明显缺陷的，不建议这样子使用 尽量只对一块整体的内存或者char*使用 谢谢！ 那我应该怎样将这这几种数据类型拷贝到char[]中？

user: user-2
content: int float double 的存储结构导致的  int的存储的是 0x00000001 那么复制到buf就是 1000 sizeof(int) 大小，这里假定是4字节  strlen是依据 '\0' 结束的，那么计算出来就是1了  至于float double（3.0,5.0）第一个byte就是 0 了，那么长度自然是 0 平台不懂，存储的结构并不一致，不便多讨论，你换个数字可能就不一样的结果了  memcpy是按字节拷贝的，所以你以上的用法是有明显缺陷的，不建议这样子使用 尽量只对一块整体的内存或者char*使用