c++ <错误:无法访问地址 0x1 处的内存>

Lui*_*rez -1 c++

我真的不明白为什么我的代码有这个问题

首先,我创建了两个指向 char 的指针

char* finWord;
char* ignoredWord;
Run Code Online (Sandbox Code Playgroud)

然后我将它们作为参数传递给其他函数

lowerCase(line.substr(0, endWord), ignoredWord);
toNormalWord(ignoredWord, finWord);
Run Code Online (Sandbox Code Playgroud)

但是当我运行程序时,它抛出了一个分段错误,问题是 finWord 地址总是 0x1

这里是问题发生的地方

void toNormalWord (string src, char* des) 
{
    char c;
    des[sizeof(src) + 1];
    int position = 0; 

    if (isThere)
    {
        des[position] = c; //Here the gdb show me the following error 0x1 <error: 
                           // Cannot access memory at address 0x1>
        position++;
    }
}
Run Code Online (Sandbox Code Playgroud)

Bar*_*rry 5

这一行:

des[sizeof(src) + 1];
Run Code Online (Sandbox Code Playgroud)

什么也没做。但即使它做了一些事情,它也不会做你想让它做的事情。首先,您只是在某处引用内存中的单个字节,而不对其进行任何操作。其次,sizeof(src)不是你传入的字符串的长度......它是std::string类的大小,它是一个独立于实际字符串长度的常量。

您的意思实际上是创建一个新数组:

des = new char[src.size() + 1];
Run Code Online (Sandbox Code Playgroud)

但这只会泄漏内存,因为它des是一个局部变量。你可能想要做的是:

char* toNormalWord(const std::string& src) 
{
    char* des = new char[src.size() + 1];
    // stuff
    return des;
}
Run Code Online (Sandbox Code Playgroud)

或者甚至更好,不用于char*开头:

std::string toNormalWord(const std::string& src)
{
    std::string des = src;
    // stuff
    return des;
}
Run Code Online (Sandbox Code Playgroud)