指针值似乎受到其前面的值的影响

Pointer value seems to be affected by value preceding it

本文关键字:前面 影响 指针      更新时间:2023-10-16

在我当前的工作流程中,我正在通过Python从Blender导出3D模型以及各种信息(顶点颜色、UV坐标等)。它存储在一个二进制文件中,可以用C++读取。

考虑以下代码:

Python:

ar = [0, 1, 2, 3, 4]
with open('model.bin', 'wb') as file:
    file.write(struct.pack('%si' & len(ar), *ar))

C++:

u32* ar = (u32*) model_bin; //model_bin is already declared externally
for(int i=0; i<5; i++){
    printf("%dn", ar[i]);

}

这很管用!但是,我的文件包含不止一个数据列表。它包含许多不同类型的数据。我在每个新"元素"开头的不同指针的帮助下跟踪这一点。即:

rgb* vcols = (rgb*) model_bin;
u32* uvco = (u32*) ((char*) vcols + 2*numVcols)

现在,除了我的UV纹理的第一个值之外,所有的东西都检查出来了。在我的导出脚本中将其设置为0会使我的C++应用程序将其读取为-566558720。

但是,如果我将UV坐标号导出并读取为短裤,则一切都会正常工作。

但情况越来越好了!当我将最后一个vcol[]元素的值设置为0时,我可以很好地读取写入的int!将最终vcol设置为1将使第一个uvco读取为65578。

我意识到在没有看到实际代码之类的情况下进行调试是非常棘手的,但也许有人可以根据这些信息向我提供一些见解或建议?

谢谢,

Patrick

编辑:不小心把vcols写成了u16[],而它实际上是一个rgb[]。rgb是一个typedef的无符号short。

我需要调试你的代码,以找出你为什么要覆盖内存的其他部分,但如果这是由于双关语,我不会感到震惊。

作为所有强制转换的替代方案,您可以将数据memcpy()到必需的变量中。

u32 ar;
memcpy(&ur, model_bin, sizeof(u32));

考虑到我在评论中发布的链接,投指针应该会让你感到紧张。使用memcpy()更安全,而且不会得到所有这些编译器警告和错误。

我的数据对齐出现错误。在指出这个想法后,我检查了指针地址,它不能像应该的那样被4除。添加填充已经解决了这个问题。