different
V2EX  ›  C

关于 memcpy 的问题。

  •  
  •   different · Nov 19, 2019 · 5421 views
    This topic created in 2546 days ago, the information mentioned may be changed or developed.

    部分代码:

    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 的问题。代码太多,不好全部贴上,只贴出部分代码,求分析原因。

    Jabin
    Jabin
    Nov 19, 2019
    1
    "\0" ?
    wutiantong
    wutiantong
    Nov 19, 2019
    2
    学过 C 的都应该知道,这跟 memcpy 无关,而是关于字符串的定义。
    hualuogeng
    hualuogeng
    Nov 19, 2019
    3
    strcpy or strncpy, 不要忘了‘\0’
    newtype0092
    newtype0092
    Nov 19, 2019
    4
    长度 24 的字符串占用 25 个字符吧,你只有个指针,末尾不加个'\0' printf 也不知道读到哪算完啊。
    tomychen
    tomychen
    Nov 19, 2019
    5
    \0 ?
    canyue7897
    canyue7897
    Nov 19, 2019
    6
    字符串存储和字符存储的问题吧。。。差一个\0
    ipwx
    ipwx
    Nov 19, 2019
    7
    printf %s 需要遇到 '\0' 才截止。楼主只输出 25 个字符是运气好。

    话说这么基础的问题,楼主都不懂么?
    different
    different
    OP
    Nov 19, 2019
    8
    @ipwx
    @canyue7897
    @tomychen
    @newtype0092
    @hualuogeng
    @wutiantong
    @Jabin

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

    感谢,获益良多!
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1489 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 43ms · UTC 06:11 · PVG 14:11 · LAX 22:11 · JFK 01:11
    ♥ Do have faith in what you're doing.