在功能块之后更改指针值

时间:2018-03-15 02:43:07

标签: c++ visual-studio pointers access-violation

我有这段代码:

#include <iostream>
#include <string.h>
using namespace std;

void copyString(char *input, int offset, int length, bool invert, char *output, int output_offset)
{
char *cp = new char[length+1];
for (int i = 0; i < length + 1; i++)
{
    cp[i] = input[offset + i];
}
if (invert)
{
    for (int i = 0; i < length/2; i++)
    {
        swap(cp[i], cp[length - i - 1]);
    }
}
int count = 0;
while (output[count])
    count++;
int cutlength = count - output_offset;
char *temp = new char[count + 1];
for (int i = 0; i < count + 1; i++)
    temp[i] = output[i];
for (int i = 0; i < cutlength; i++)
{
    temp[output_offset + i] = cp[i];
}
output = temp;
}

void main()
{
char *st = "Hello world";
cout << "st= " << st << endl;
char *st2 = "My name is C++";
cout << "st2= " << st2 << endl;
copyString(st, 6, 5, true, st2, 11);
cout << "st2 output= " << st2 << endl;
system("Pause");
}

这个想法是该函数将复制输入字符串的长度,并用复制的字符串替换输出的一部分。

我想要做的就是在copyString函数之后使 st2值改变,但我似乎无法通过 temp var来改变它。但是,如果我尝试更改函数中的 st2 值,则会出现访问冲突错误。知道如何解决这个问题吗?

4 个答案:

答案 0 :(得分:0)

您的fcs函数通常类似于C copyString函数(如果不将反转选项带入帐户)。它需要输出为已分配的足够大小的缓冲区(strcpy数组)以将字符串内容写入(例如,您可以使用char分配缓冲区)。但是,您尝试写入字符串常量new char[strlen(str) + 1]"Hello world"所在的内存。这显然是内存访问冲突(否则你会修改这些常量)。

无需说这种处理字符串的方式非常容易出错,而且远非C ++。

答案 1 :(得分:0)

1)您计算output长度(未定义的行为!),而不是input长度。

2)output指针无处可去 - 你想为它使用引用函数参数吗?

答案 2 :(得分:0)

st和st2是指向常量字符串的指针,因此你不应该尝试更改那些内容(尽管你可以让它们指向完全不同的字符串)。

要使st2成为可编辑的字符数组(字符串),您应该按如下方式声明st2

char st2[] = "My name is C++";

在copyString函数中,输出指针最初指向与st2相同的位置,然后在函数的末尾使输出点位于不同的字符串。然而,这不会以任何方式改变st2或其内容。

你需要让st2成为一个字符数组并在copyString函数中编辑这个数组,或者让copyString函数创建并返回一个st2可以指向的新字符串(尽管如果不是你可能会导致内存泄漏)小心)。

以下应该做你想做的事。通过完全删除cp并直接从输入缓冲区写入输出缓冲区,可以稍微改进一下。

void copyString(char *input, int offset, int length, bool invert, char *output, int output_offset)
{
    char *cp = new char[length+1];
    for (int i = 0; i < length + 1; i++)
    {
        cp[i] = input[offset + i];
    }
    if (invert)
    {
        for (int i = 0; i < length/2; i++)
        {
            swap(cp[i], cp[length - i - 1]);
        }
    }
    int count = strlen(output);
    int cutlength = count - output_offset;
    for (int i = 0; i < cutlength; i++)
    {
        output[output_offset + i] = cp[i];
    }
    delete[] cp;
}

void main()
{
    char st[] = "Hello world";
    cout << "st= " << st << endl;
    char st2[] = "My name is C++";
    cout << "st2= " << st2 << endl;
    copyString(st, 6, 5, true, st2, 11);
    cout << "st2 output= " << st2 << endl;
    system("Pause");
}

答案 3 :(得分:0)

内存访问冲突是由于您正在尝试修改字符串,其大小无法容纳额外的长度(即您的情况下为st2)

注意:当您更新st2&lt; - temp。

的基址时,Temp方法可以正常工作

还可以对偏移和边界进行边界检查。还建议使用输入参数长度。 通常使用 strcpy_s 优先于 strcpy