【问题标题】:memcpy issues; copying wrong block and multiple times内存问题;复制错误的块和多次
【发布时间】:2011-05-04 06:19:10
【问题描述】:
#include <iostream>
#include <string.h>
using namespace std;

int sk00(char * a)                    //use to find length, in characters, of an expression
{
    int b = 1, c = 0;
    while(b != 0)
    {
        if (a[c] == '`'){b++;}
        else{b--;}
        c++;
    }
    return c;
}

void sk07(char * a)
{
    int b = 0; while(a[b]!=0){b++;}b -= 2;
    memcpy(a,a+3,b);
    memcpy(a+sk00(a),a+sk00(a)+sk00(a+sk00(a)),b);
}

void sk20(char * z)
{
    char * a = z + 2;
    int b = 0;while(a[b]!=0){b++;}b-=1;
    memcpy(a,a+2,b);
    int al = sk00(a), bl = sk00(a+al), cl = sk00(a+al+bl);
    b=b-(al+bl+cl);
    memcpy(a+al+cl+1, a+al, b+cl+bl);
}

int main()
{
    char a[] = "``````s`k`sikabcd";
    sk20(a+3);
    cout << a << "; Final.\n";
}

终端输出:

pup@aurora-217:~/sk$ g++ sk5.c
pup@aurora-217:~/sk$ ./a.out
``````k`sikakakad; Final.
pup@aurora-217:~/sk$ 

我期待一个类似于

的输出
`````ksik`sikabcd

【问题讨论】:

  • 我试着看代码,但看了一秒后感觉有点头晕
  • 你试过在调试器中运行你的代码吗?哪条线路与您的预期不符?
  • 标识符的选择可能不是最好的,您应该致力于提供比sk00sk07sk20 更好的标识符。确定每个功能的用途并使用有助于理解它的名称。此外,对您正在尝试做的事情的简要描述将有助于其他人理解代码并提供有用的 cmets。
  • @Rob,像这样的事情,您需要自己调试并归结为您有疑问的特定代码,而不是让我们为您找出和调试整个东西。
  • 总是sk20的最后一行不起作用。公平地说,我已经尝试了几个小时来解决这个问题。我曾假设 memcpy 可以处理重叠块。

标签: c++ combinators


【解决方案1】:

从技术上讲,如果 b 大于 2 或 3,您在 sk07 中会遇到问题,因为您不能在源和目标重叠的情况下使用 memcpy。你可以试试 memmove。

我们这里是否有重叠,例如

memcpy(a+al+cl+1, a+al, b+cl+bl); 

很难说。

【讨论】:

    【解决方案2】:

    在内存位置可能重叠的情况下,您的代码中看起来就是这种情况,您应该使用 memmove 函数而不是 memcpy 例程。 memcpy 例程在内存位置重叠的情况下使用被认为是不安全的,因为优化可能会使结果输出变得一团糟。

    memmove 以与 memcpy 相同的顺序采用相同的参数,因此可以用作替代品。

    【讨论】:

      猜你喜欢
      • 2015-10-17
      • 2022-12-30
      • 1970-01-01
      • 1970-01-01
      • 2013-08-25
      • 2023-01-24
      • 1970-01-01
      • 2011-07-30
      相关资源
      最近更新 更多