【发布时间】:2018-06-08 06:55:16
【问题描述】:
我正在尝试制作一个使用从三个不同数组访问的预设音节的名称生成器。
#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 个音节,所以我将最小值设置为 0,最大值设置为 5。总共六个数字。然而,出于某种原因,它看起来像是在某个地方生成了 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.
【问题讨论】:
-
您不能为
const变量赋值。你只能初始化它们(我有点惊讶它编译)。由于您没有初始化name,因此它是一些随机的垃圾指针。然后,您尝试写入该位置,即未定义行为。 -
你希望
name = firstSyllable + *secondSyllable + *lastSyllable;做什么? -
您或许可以考虑使用
std::string和诸如std::vector之类的STL 容器。另外,请查看您如何连接名称部分。 -
@Yksisarvinen 不,OP 不会尝试写入
name指向的位置。他分配了所述内存位置,而不取消引用它。 -
@JacobMcNamara 那么,你应该向good C++ book 学习 C++。通过猜测来学习 C++不是正确的方法。