部分代码:
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
奇怪的是,dstAddr 长度不应该只有 24 吗?怎么输出 25 个字符了?
标题不好拟,不确定是不是 memcpy 的问题。代码太多,不好全部贴上,只贴出部分代码,求分析原因。
1
Jabin 2019 年 11 月 19 日
"\0" ?
|
2
wutiantong 2019 年 11 月 19 日
学过 C 的都应该知道,这跟 memcpy 无关,而是关于字符串的定义。
|
3
hualuogeng 2019 年 11 月 19 日
strcpy or strncpy, 不要忘了‘\0’
|
4
newtype0092 2019 年 11 月 19 日
长度 24 的字符串占用 25 个字符吧,你只有个指针,末尾不加个'\0' printf 也不知道读到哪算完啊。
|
5
tomychen 2019 年 11 月 19 日
\0 ?
|
6
canyue7897 2019 年 11 月 19 日
字符串存储和字符存储的问题吧。。。差一个\0
|
7
ipwx 2019 年 11 月 19 日
printf %s 需要遇到 '\0' 才截止。楼主只输出 25 个字符是运气好。
话说这么基础的问题,楼主都不懂么? |
8
different OP |
9
zjsxwc 2019 年 11 月 19 日
你只有一个指针地址,又不知道字符串真正的长度,printf 是一直输出碰到\0 才停止的,如果没碰到\0 就算输出 100 个字符也不奇怪,你这里输出 25 个没毛病
|
11
oceanTu 2019 年 11 月 19 日
man strdup 可以少写几行, 代码像裙子 短点好
|
12
ysc3839 2019 年 11 月 19 日 @different 即使是 char A[24]; 这样的数组,传递给 printf 也会降级为指针的。除非用 C++ 模板来取数组长度。
|
14
ipwx 2019 年 11 月 19 日 via Android
@different 在大部分情况下,c 语言里面的 char[n] 和 char* 没区别。另外,几乎所有 c 语言函数,只要没有额外给 size_t n 参数的,都是\0 定界。
|
15
ipwx 2019 年 11 月 19 日 via Android
@different 在我所知的手段里面,能把 char[n]里面的 n 搞出来的,只有 c++模板匹配能做的到。而且一般没人这么做,都有 c++了当然写个类把 char*和 size_t n 放一起啦,然后再写个模板函数 StringPrintf,爽歪歪
|
16
iceheart 2019 年 11 月 19 日 via Android
printf("%.*s\n", request.addrLength, request.dstAddr);
|
17
msg7086 2019 年 11 月 19 日
你用 C 字符串但是不写 0 结尾会直接导致内存读取越界。
|