关于 memcpy 的问题。 - V2EX
different
V2EX    C

关于 memcpy 的问题。

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

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

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

    感谢,获益良多!
    About     Help     Advertise     Blog     API     FAQ     Solana     3300 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 92ms UTC 13:46 PVG 21:46 LAX 06:46 JFK 09:46
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86