【问题标题】:Memory manipulating - what am I doing wrong?内存操纵 - 我做错了什么?
【发布时间】:2013-01-21 12:06:52
【问题描述】:

是的,所以我正在玩弄内存移动数据。我在这里遇到了麻烦。 我做错了什么?我已经考虑了空终止符,但它仍然没有输出我所期望的。

char buff[34] = "I will not do anything like that.";
char * protocol = "abcdefghi";

char data[44];

memcpy(data, protocol, 10);
memcpy(data + 9, buff, 34);

cout << data << endl; //abcdefghiI will not do anything like that.
cout << strlen(data) << endl; // 42

char poin[10];
memcpy(poin, data, 10);

cout << poin << endl; //abcdefghiI╠╠╠╠╠╠╠╠╠╠abcdefghiI will not do anything like that.

对于最后一个 cout,我期待的只是 abcdefghi,但结果如您所见。 任何帮助表示赞赏,谢谢!

【问题讨论】:

  • 我不建议在 C++ 中使用 strcpy 来复制字符串,但使用 memcpy 完全是另一个级别的 C 与类。我会推荐一本好书:stackoverflow.com/q/388242/46642
  • 顺便说一句,答案很简单“不,你没有考虑空终止符”

标签: c++ arrays memory character memcpy


【解决方案1】:

poin 不是以'\0' 结尾的字符串。您在这里用'I' 覆盖了第一个'\0'

memcpy(data + 9, buff, 34);

【讨论】:

    【解决方案2】:

    因为poin 不是以空值结尾的。 您将data 的前10 个字节复制到poin,所以现在

    poin[0] == 'a'
    poin[1] == 'b'
    poin[2] == 'c'
    poin[3] == 'd'
    poin[4] == 'e'
    poin[5] == 'f'
    poin[6] == 'g'
    poin[7] == 'h'
    poin[8] == 'i'
    poin[9] == 'I'
    

    然后,std::cout 超出了数组poin 的边界,这些地址中的值确实是未知的。

    【讨论】:

      【解决方案3】:

      最后一个memcpy 不包括用于终止C 样式字符串的'\0'

      使用 strcpy 或使用 C++ - std::string 会更好。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-06-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-16
        • 2021-04-14
        • 2021-04-19
        • 2017-03-13
        相关资源
        最近更新 更多