0xC0000005:访问冲突读取位置0x0000000000000008

时间:2018-06-08 06:55:17

标签: c++ exception

我正在尝试创建一个使用从三个不同阵列访问的预设音节的名称生成器。

#include "main.hpp"

Namegen::Namegen() {
}

const char *Namegen::getFirst() {
    const char *name;
    int rNum = rng->getInt(0, 5);
    const char *firstSyllable = start[rNum];
    rNum = rng->getInt(0, 5);
    const char *secondSyllable = mid[rNum];
    rNum = rng->getInt(0, 5);
    const char *lastSyllable = end[rNum];

    name = firstSyllable + *secondSyllable + *lastSyllable;

    return name;
}

每个数组总共有6个音节,所以我将min设置为0,最大值设置为5.总共有6个数字。然而,出于某种原因,看起来它在某处产生了8?我不完全确定异常是在谈论什么,但希望其他人这样做。这是例外(即使它已经在标题中):

0xC0000005: Access violation reading location 0x0000000000000008.

这是我的Namegen.hpp文件(通过main.hpp文件链接):

#pragma once

class Namegen {
public:
    const char *start[6] = { "Ba", "Ce", "Ti", "Mo", "Lu", "Dy" };
    const char *mid[6] = { "ma", "te", "di", "so", "ku", "ly" };
    const char *end[6] = { "ban", "can", "dan", "fan", "gan", "han" };

    Namegen();
    TCODRandom *rng;
    const char *getFirst();
};

为什么会抛出此异常,我该如何解决?

我已经明白我可以使用以下代码成功连接值:

std::string Namegen::getName() {
    int r = rng->getInt(0, 2);
    std::string firstSyll = fSyll[r];
    r = rng->getInt(0, 2);
    std::string midSyll = mSyll[r];
    r = rng->getInt(0, 2);
    std::string lastSyll = lSyll[r];

    std::string name = std::string(firstSyll) + std::string(midSyll) + std::string(lastSyll);

    return name;
}

但是,它现在抛出了这个异常:

Exception thrown at 0x00007FF978AD9E7A (ucrtbased.dll) in AotDK.exe: 0xC0000005: Access violation reading location 0x0000000000000000.

1 个答案:

答案 0 :(得分:6)

name = firstSyllable + *secondSyllable + *lastSyllable;无法接近连接。 (编译器编译它,因为它认为你在firstSyllable上做了一些指针算术。)当你将一些不是nullptr的东西或一个对象的地址分配给{时,行为实际上是未定义的。 {1}}。

抛弃所有name内容,然后使用char*代替。然后std::string 充当连接,因为它是字符串类中的重载运算符。

您的数据将采用

形式
+

演示了C ++标准库的强大功能。您需要std::vector<std::string> start = { "Ba", "Ce", "Ti", "Mo", "Lu", "Dy" }; #include <string>才能引入该功能。