关于 memcpy 的问题。

2019-11-19 10:43:03 +08:00
 different

部分代码:

request.dstAddr = new unsigned char[request.addrLength];

memcpy(request.dstAddr, buffer + p, request.addrLength);

printf("%d\n", request.addrLength);

printf("%s\n", request.dstAddr);

printf("%s\n", buffer + p);

输出:

24

developers.weixin.qq.comq

developers.weixin.qq.com

奇怪的是,dstAddr 长度不应该只有 24 吗?怎么输出 25 个字符了?

标题不好拟,不确定是不是 memcpy 的问题。代码太多,不好全部贴上,只贴出部分代码,求分析原因。

3905 次点击
所在节点    C
19 条回复
Jabin
2019-11-19 10:45:59 +08:00
"\0" ?
wutiantong
2019-11-19 10:46:51 +08:00
学过 C 的都应该知道,这跟 memcpy 无关,而是关于字符串的定义。
hualuogeng
2019-11-19 10:48:30 +08:00
strcpy or strncpy, 不要忘了‘\0’
newtype0092
2019-11-19 10:49:39 +08:00
长度 24 的字符串占用 25 个字符吧,你只有个指针,末尾不加个'\0' printf 也不知道读到哪算完啊。
tomychen
2019-11-19 11:00:31 +08:00
\0 ?
canyue7897
2019-11-19 11:02:41 +08:00
字符串存储和字符存储的问题吧。。。差一个\0
ipwx
2019-11-19 11:05:36 +08:00
printf %s 需要遇到 '\0' 才截止。楼主只输出 25 个字符是运气好。

话说这么基础的问题,楼主都不懂么?
different
2019-11-19 11:12:14 +08:00
@ipwx
@canyue7897
@tomychen
@newtype0092
@hualuogeng
@wutiantong
@Jabin

啊哈哈,感谢,我错了。
zjsxwc
2019-11-19 11:27:40 +08:00
你只有一个指针地址,又不知道字符串真正的长度,printf 是一直输出碰到\0 才停止的,如果没碰到\0 就算输出 100 个字符也不奇怪,你这里输出 25 个没毛病
different
2019-11-19 11:38:02 +08:00
@zjsxwc 感谢理解了,我把 char A[24];等同于 char *A = new char[24];了
oceanTu
2019-11-19 11:40:58 +08:00
man strdup 可以少写几行, 代码像裙子 短点好
ysc3839
2019-11-19 12:51:50 +08:00
@different 即使是 char A[24]; 这样的数组,传递给 printf 也会降级为指针的。除非用 C++ 模板来取数组长度。
different
2019-11-19 13:02:35 +08:00
@ysc3839 尴尬
ipwx
2019-11-19 13:05:16 +08:00
@different 在大部分情况下,c 语言里面的 char[n] 和 char* 没区别。另外,几乎所有 c 语言函数,只要没有额外给 size_t n 参数的,都是\0 定界。
ipwx
2019-11-19 13:07:02 +08:00
@different 在我所知的手段里面,能把 char[n]里面的 n 搞出来的,只有 c++模板匹配能做的到。而且一般没人这么做,都有 c++了当然写个类把 char*和 size_t n 放一起啦,然后再写个模板函数 StringPrintf,爽歪歪
iceheart
2019-11-19 13:13:17 +08:00
printf("%.*s\n", request.addrLength, request.dstAddr);
msg7086
2019-11-19 13:42:51 +08:00
你用 C 字符串但是不写 0 结尾会直接导致内存读取越界。
LANB0
2019-11-19 13:49:58 +08:00
@different char A[24];等同于 char *A = new char[24];也没多大毛病啊,只不过一个在栈区一个在堆区。你的问题是长度 24 的数组或者缓冲区,你只能存 23 个字符+'\0'
different
2019-11-19 15:13:41 +08:00
@ipwx
@iceheart
@msg7086
@LANB0

感谢,获益良多!

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/620934

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX