【问题标题】:c++ <error: Cannot access memory at address 0x1>c ++ <错误:无法访问地址0x1处的内存>
【发布时间】:2015-01-01 06:05:59
【问题描述】:

我真的不明白为什么我的代码会出现这个问题

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

char* finWord;
char* ignoredWord;

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

lowerCase(line.substr(0, endWord), ignoredWord);
toNormalWord(ignoredWord, finWord);

但是当我运行程序时,它会抛出一个分段错误,问题是 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++;
    }
}

【问题讨论】:

  • 我不认为des [sizeof(src) + 1]; 正在做你认为它正在做的事情
  • 除了创建指针之外,您还应该使指针指向某个地方。目前,它们只是垃圾,或者说是 0,也好不了多少。也就是说,它们指向的不是有效地址,而是 Nirvana,这就是您使用它们时的进程所在。
  • 您的变量似乎未初始化。

标签: c++


【解决方案1】:

这一行:

des[sizeof(src) + 1];

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

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

des = new char[src.size() + 1];

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

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

或者更好的是,不要使用char*开头:

std::string toNormalWord(const std::string& src)
{
    std::string des = src;
    // stuff
    return des;
}

【讨论】:

    猜你喜欢
    • 2017-08-28
    • 1970-01-01
    • 2018-09-08
    • 2013-02-18
    • 1970-01-01
    • 2017-02-28
    • 1970-01-01
    • 2013-10-30
    • 1970-01-01
    相关资源
    最近更新 更多