我的问题是-我有这几行代码:

// 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]

10-07 13:49