zoukankan      html  css  js  c++  java
  • strcpy 通过指针复制字符串出错问题

    还是 C++ 吧里的一个问题, 问题是这样的:

    char* p = "shen me gui";
    char* q = "hehe";
    strcpy(p, q);

    为何会出错。

    我当时其实也是挺奇怪, 主要我入门就是 C++ 11 标准, string 用惯了。

    后来问题解决了, 是因为如此初始化的指针是一个常量指针, 所以对它们操作自然就错了。

    我现在一想起来就觉得恶心, 常量你咋就没 const 呢?

    正确的写法是这样的:

    char str1[] = "shen me gui";
    char str2[] = "hehe";
    strcpy(str1, str2);

    所以……到这就结束了吗?当然不是!如果你用的和我一样都是 VS 2013 的话, 你可能也会发现在 Debug 模式下, 上面的代码是不会成功的, 因为编译器会建(qiang)议(po) 你使用 strcpy_s, 用就用呗, 结果发现需要的是三个参数, 更恶心的是, 对于中间的参数还有要求:

    strcpy_s(str1, size, str2);

    问题就是出在这个 size 上面了, 填多少呢? 实际上, 填少了填多了都会导致内存泄漏, 编译器会 duang 的一声提醒你, 十分之不爽。

    那么, 多少合适呢? 答案是 str2 的 size。至于为什么呢? 我想看了 vs 2013 里的实现你可能就明白了:

    _FUNC_PROLOGUE
    errno_t __cdecl _FUNC_NAME(_CHAR *_DEST, size_t _SIZE, const _CHAR *_SRC)
    {
        _CHAR *p;
        size_t available;
    
        /* validation section */
        _VALIDATE_STRING(_DEST, _SIZE);
        _VALIDATE_POINTER_RESET_STRING(_SRC, _DEST, _SIZE);
    
        p = _DEST;
        available = _SIZE;
        while ((*p++ = *_SRC++) != 0 && --available > 0)
        {
        }
    
        if (available == 0)
        {
            _RESET_STRING(_DEST, _SIZE);
            _RETURN_BUFFER_TOO_SMALL(_DEST, _SIZE);
        }
        _FILL_STRING(_DEST, _SIZE, _SIZE - available + 1);
        _RETURN_NO_ERROR;
    }
  • 相关阅读:
    JOI2017FinalC JOIOI 王国
    JOISC2017C 手持ち花火
    P4336 [SHOI2016]黑暗前的幻想乡
    SP104 HIGH
    P3160 [CQOI2012]局部极小值
    P4965 薇尔莉特的打字机
    【BZOJ4361】isn
    P3506 [POI2010]MOT-Monotonicity 2
    P3214 [HNOI2011]卡农
    P3704 [SDOI2017]数字表格
  • 原文地址:https://www.cnblogs.com/wuOverflow/p/4544204.html
Copyright © 2011-2022 走看看