尝试在函数内添加指向数组的指针时程序失败(C)

时间:2012-11-14 03:11:29

标签: pointers struct segmentation-fault sorting

我无法使此代码正常工作。当我尝试编译它时,会发生以下三种情况之一:要么我没有错误,但是当我运行程序时,它会立即锁定;或者它编译得很好,但是说“分段错误”并在我运行时退出;或者在编译时发出警告:

"conflicting types for ‘addObjToTree’
previous implicit declaration of ‘addObjToTree’ was here"

然后说“分段错误”并在我尝试运行时退出。

我使用的是Mac OS X 10.6。

游戏obj.h:

typedef struct itemPos {
    float x;
    float y;
} itemPos;

typedef struct gameObject {
    itemPos loc;
    int uid;
    int kind;
    int isEmpty;
       ... 
 } gameObject;

内部routines.h:

void addObjToTree (gameObject *targetObj, gameObject *destTree[]) {
    int i = 0;
    int stop = 1;
    while (stop) {
        if ((*destTree[i]).isEmpty == 0)
            i++;
        else if ((*destTree[i]).isEmpty == 1)
            stop = 0;
        else
            ;/*ERROR*/
            }

    if (stop == 0) {
        destTree[i] = targetObj;
    }
    else
    {
        ;/*ERROR*/
    }

}

/**/

void initFS_LA (gameObject *target, gameObject *tree[], itemPos destination) {

    addObjToTree(target, tree);
    (*target).uid = 12981;
    (*target).kind = 101;
    (*target).isEmpty = 0;
    (*target).maxHealth = 100;
    (*target).absMaxHealth = 200;
    (*target).curHealth = 100;
    (*target).skill = 1;
    (*target).isSolid = 1;
    (*target).factionID = 555;
    (*target).loc.x = destination.x;
    (*target).loc.y = destination.y;

}

main.c中:

   #include "game-obj.h"
    #include "internal-routines.h"
    #include <stdio.h>

    int main()
{
    gameObject abc;
    gameObject jkl;
    abc.kind = 101;
    abc.uid = 1000;

    itemPos aloc;
    aloc.x = 10;
    aloc.y = 15;

    gameObject *masterTree[3];
    masterTree[0] = &(abc);

    initFS_LA(&jkl, masterTree, aloc);
    printf("%d\n",jkl.factionID);
    return 0;
}

我不明白为什么它不起作用。我只想让addObjToTree(...)在masterTree的下一个空闲空间中添加一个指向gameObject的指针,这是一个指向gameObject结构的指针数组。甚至更奇怪,如果我从addObjToTree(target, tree);删除行initFS_LA(...),它就能完美运行。我已经创建了一个按masterTree搜索uid的功能,即使我使用gameObject初始化新的initFS_LA(...)(没有addObjToTree也可以正常工作我已经尝试重新排列头文件中的函数,将它们放入单独的头文件中,对它们进行原型设计,重新排列#include的顺序,显式创建指针变量而不是使用&jkl ,但绝对没有用。有任何想法吗?我感谢任何帮助

1 个答案:

答案 0 :(得分:0)

如果我看到这个,那么你不会在任何地方初始化masterTree数组的元素1和2。然后,您的addObjToTree()函数在--ininitialized - 数组中搜索一个自由元素。

在C中声明类似gameObject *masterTree[3];的变量不会对数组进行零初始化。添加一些memset (masterTree, 0, sizeof (masterTree));进行初始化。

请注意,您在这里声明了一个指向结构的指针数组,而不是结构数组(另请参阅here),因此您还需要调整addObjToTree()以检查是否为NULL指针而不是isEmpty

将该数组的长度传递给该函数以避免缓冲区溢出也是一种好习惯。

如果你想要一个结构数组,那么你需要将它声明为gameObject masterTree[3];addObjToTree()中的参数变为gameObject *tree