C++ 无法将 1 写入结构成员

标签 c++ visual-c++ pointers struct bit

我在将 1 写入结构的成员时遇到一点问题。

我有一个代表体素的结构,它可以有 8 个 child (ID 0-7)。为了说明体素有哪些 child ,我使用了一个无符号的 8 位整数。如果 Voxel 有某个 child ,则 child 成员中等于 child ID 的位置的位设置为 1。

例如,如果 Voxels 子成员存储值: 10000101 然后体素将有 child 0、2 和 7(从右到左)。

体素结构的代码如下:

typedef struct Voxel {
       uint8_t children; //list of children
       Voxel* firstChildPointer;
};

第一个子指针指向体素列表的开始,这些体素是这个体素的 child 。

问题出现在想添加 child 的时候。我需要更改 children 成员以反射(reflect)添加的 child 。但是,在执行此操作时,我收到运行时异常,提示“访问冲突写入位置”后跟内存地址。

我用来改变 child 的代码如下:

void addVoxel(Voxel* parent, char childID) {
       parent->children |= (1 << childID); }

当所有 Voxel 首次加载到内存中时,Voxel 的子项设置无误。 但在那之后我不能给成员写 1。 0 写得很好。我尝试过使用多种方法来写东西,甚至是对数字进行简单的旧赋值。但是,如果该数字有更多的 1,那么它将不起作用。

在这种情况下,指向父对象的指针碰巧存储为全局变量,并且每个体素还存储指向其子对象的指针,这可能是问题所在吗?如果是这样,将 parent 作为引用有帮助吗?我知道如何在 C# 中执行此操作,但在 C++ 中不知道。

任何帮助都会很棒。

S.

编辑:

使用此行调用添加体素方法:

addVoxel(octree, 4);

八叉树是一个体素指针,定义如下:

Voxel* octree = octreeLoader.loadVoxelData();

加载体素数据方法从文件中加载八叉树信息。我们知道这部分和返回指针起作用,因为我们使用它们的精确拷贝来进行光线追踪。但是简而言之,指针是使用这一行创建的:

Voxel* octree;

然后使用这一行分配内存:

octree = (Voxel *) calloc(1, sizeof(Voxel));

然后使用此行分配子项:

octree[0].children = children;

然后以相同的方式创建每个进一步的 child 并给予内存。我已经检查了 children 成员是否已正确初始化并且 childID 是否正确。

最佳答案

不知何故,您的父指针无效。否则更改数字不会导致访问冲突。我猜你使用这些索引来遍历树?你应该尝试像 valgrind 这样的工具。它可能会使调试更容易。

关于C++ 无法将 1 写入结构成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9220403/

相关文章:

c++ - 将对 const 指针的引用从指向非 const 的指针定位

c++ - 创建行优先数组时出现段错误

c++ - 在 "margin"中绘图作为 IDE/编辑器功能

c++ - 为什么从 char* 到 LPCWSTR 的自动转换仅在未设置字符集的情况下有效

c++ - 如何将 C 转换为 C++?

c - 将结构数组传递给函数作为输入

c++ - 调用函数指针会导致段错误?

c++ - 有效地将子字符串从 const char* 复制到 std::string

c++ - 我怎样才能明智地重载放置运算符 new?

pointers - shared_ptr 不改变对象(Visual Studio 2012)