实例化struct - C ++时出现分段错误

时间:2012-11-10 12:24:47

标签: c++ pointers struct segmentation-fault fault

尝试从wavefront文件加载3d对象并将其保存到我预定义的结构中时遇到问题。我得到一个分段错误错误,我假设我的指针出错了。以下是结构:

struct vertex
{
    float x,y,z;
};

// the idea is to split each object into groups in order to animate
// them seperately
struct group
{
    float xpos, ypos, zpos;
    float xrot, yrot, zrot;

    int numVertices;
    int numFaces;

    //all verteces
    vertex vertices[MAX_NUM];

    //faces-- a face is made up of one vertex from each of these arrays
    vertex vertexOne[MAX_NUM];
    vertex vertexTwo[MAX_NUM];
    vertex vertexThree[MAX_NUM];
};

struct object
{
    float xpos, ypos, zpos;
    float xrot, yrot, zrot;

    int numGroups;
    group * groups[MAX_NUM];
};

这是应该加载对象的函数:

object * loadObject(char * path)
{
object * obj;
obj = new object;

char str[1];
obj->numGroups = 0;
FILE * file = fopen(path, "r");

while(fscanf(file, "%s", str) != EOF)
{
    if(str[0] == 'o')
    {
        obj->numGroups++;
        obj->groups[obj->numGroups-1] = new group;

        obj->groups[obj->numGroups-1]->numVertices = 0;
        obj->groups[obj->numGroups-1]->numFaces = 0;
    }
    else if(str[0] == 'v' && str[1] == ' ')
    {
        obj->groups[obj->numGroups-1]->numVertices++;
        sscanf(str, "v %f %f %f",
        &(obj->groups[obj->numGroups-1]->vertices[obj->groups[obj->numGroups-1]->numVertices-1].x),
        &(obj->groups[obj->numGroups-1]->vertices[obj->groups[obj->numGroups-1]->numVertices-1].y),
        &(obj->groups[obj->numGroups-1]->vertices[obj->groups[obj->numGroups-1]->numVertices-1].z));
    }
    else if(str[0] == 'f')
    {
        int one, two, three;
        obj->groups[obj->numGroups-1]->numFaces++;
        sscanf(str, "f %i/%*i/%*i %i/%*i/%*i %i/%*i/%*i", &one, &two, &three);

        obj->groups[obj->numGroups-1]->vertexOne[obj->groups[obj->numGroups-1]->numFaces-1] = obj->groups[obj->numGroups-1]->vertices[one-1];
        obj->groups[obj->numGroups-1]->vertexTwo[obj->groups[obj->numGroups-1]->numFaces-1] = obj->groups[obj->numGroups-1]->vertices[two-1];
        obj->groups[obj->numGroups-1]->vertexThree[obj->groups[obj->numGroups-1]->numFaces-1] = obj->groups[obj->numGroups-1]->vertices[three-1];
    }
}

fclose(file);
return obj;
}

我已经尝试了很长一段时间来找到问题,但我根本没有得到关于错误的信息。我知道我分配顶点和面的方式有点单调乏味,对于整洁的代码的任何建议都非常受欢迎。如果需要任何其他信息,请告诉我,非常感谢您提前。

2 个答案:

答案 0 :(得分:1)

首先你做

obj->numGroups = 0;

然后在某些情况下你做

obj->groups[obj->numGroups-1]

没有增加obj->numGroups,这意味着你可以访问超出界限的数组。您也不会检查数组条目是否已分配。


另一个问题是str只有一个字符,而你的fscanf会扫描一个字符串,它会将至少两个字符放入字符串中:实际字符你想要然后字符串终止符。您也可以在循环中稍后访问str[1],这是超出范围的。所有这些都是未定义的行为,可能导致崩溃。

答案 1 :(得分:0)

如果我是你,我会远离各种fscanf()sscanf()等功能来处理输入。他们可能很冒险使用。看到这个fscanf man page因为我认为你假设fscanf()中有一个完整的字符串,你可能没有得到它。

我将采取的方法是以下步骤:(1)使用fgets()从文件中读取完整的字符串,然后使用recursive descent parser(另请参阅另一个article on recursive descent parsing })在我去的时候解析构建对象的字符串。