我的问题是-我有这几行代码:
// allocate a new vector
Vector3I *theVector = (Vector3I*)calloc(1,sizeof(Vector3I));
// write face's points to this vector
*theVector[0] = a3dsFace->points[0];
*theVector[1] = a3dsFace->points[1];
*theVector[2] = a3dsFace->points[2];
在
points[]
数组中是值{0,1,2}
。当我把它们写到指向的Vector3I
时,我得到{0,0,0}
。你对我做错什么有什么建议吗?编辑:更多详细信息:
我是lib3ds的:http://code.google.com/p/lib3ds/
struct Lib3dsFace {
Lib3dsUserData user; /*! Arbitrary user data */
char material[64]; /*! Material name */
Lib3dsWord points[3]; /*! Indices into mesh points list */
Lib3dsWord flags; /*! See Lib3dsFaceFlag, below */
Lib3dsDword smoothing; /*! Bitmask; each bit identifies a group */
Lib3dsVector normal;
};
a3dsFace
是一个Lib3dsFace
结构。点数组是这种类型的:
typedef unsigned __int16 Lib3dsWord
还有我的指针:
Vector3I* theVector
是
typedef int Vector3I[3];
我希望这能给这个问题带来一些启示。
致以亲切的问候。
最佳答案
下面的代码确实有效,是对代码片段的测试。如果有些东西不起作用,那么最好创建一个这样的测试,用硬编码的值表示*a3dsFace
,以便缩小问题的范围。
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
typedef int Vector3I[3];
typedef uint16_t Lib3dsWord;
struct Lib3dsFace {
/* ... */
Lib3dsWord points[3]; /*! Indices into mesh points list */
/* ... */
};
/* ... */
struct Lib3dsFace some_face = { {0, 1, 2} };
struct Lib3dsFace *a3dsFace = &some_face;
/* ... */
int main(void)
{
Vector3I *theVector = (Vector3I*)calloc(1,sizeof(Vector3I));
(*theVector)[0] = a3dsFace->points[0];
(*theVector)[1] = a3dsFace->points[1];
(*theVector)[2] = a3dsFace->points[2];
printf("theVector: %p, *theVector: %p, &(*theVector)[0]: %p\n", theVector, *theVector, &(*theVector)[0]);
printf("RIGHT Addresses: %p, %p, %p\n", &(*theVector)[0], &(*theVector)[1], &(*theVector)[2]);
printf("WRONG Addresses: %p, %p, %p\n", &*theVector[0], &*theVector[1], &*theVector[2]);
printf("Values: %d, %d, %d\n", (*theVector)[0], (*theVector)[1], (*theVector)[2]);
free(theVector);
return 0;
}
输出:
theVector: 0x1cd3010, *theVector: 0x1cd3010, &(*theVector)[0]: 0x1cd3010
RIGHT Addresses: 0x1cd3010, 0x1cd3014, 0x1cd3018
WRONG Addresses: 0x1cd3010, 0x1cd301c, 0x1cd3028
Values: 0, 1, 2
我把地址放在那里,这样您就可以看到
(*theVector)[0]
是访问动态分配的Vector3I
的第一个元素的有效方法。可能您没有正确设置
a3dsFace->points
,这就是复制{0, 0, 0}
的原因。还要注意,aVector3I
的每个元素都是int
类型,每个点都是uint16_t
类型。您也不需要使用calloc
来将分配的内存归零,因为您是在给它们赋值之后立即执行的;您只需使用malloc
。归根结底,您仍然没有提供足够的代码来发现您的确切问题,您应该添加代码来调试代码中的代码。
编辑:我无意中得到了
*theVector[0]
,这应该是现在的(*theVector)[0]
,因为[]
比*
具有更高的优先级。否则它将导致未定义的行为,因为事实上,你将通过数组的边界,我的错。我不知道我是怎么忘记的,当这是一个主要原因,我要张贴一个答案之前,你做你的编辑。它起作用了,但是如果你通过一个像valgrind这样的程序运行它,它会告诉你有些事情不太正确(即使它可能已经按预期运行)。从上面输出的地址可以看出,这有很大的不同。例如,具有
*theVector[1]
,因为运算符优先级与*(theVector[1])
相同,这意味着它将把theVector
指向的地址增加3 * sizeof(int)
字节(又称为sizeof(Vector3I)
),而不是仅在1 * sizeof(int)
的(正确)情况下增加(*theVector)[1]
。