简体   繁体   中英

Add element to pointer array

I have a pointer array of a custom Vector typedef (just 3 floats). I'm writing a Wavefront object loader and I want to be able to add to an array of these vectors whenever a vertex row in the file is encountered. My problem at the moment is allocating memory for the new vector.

Vector

typedef struct
{
    float x;
    float y;
    float z;
}
Vector;

Parsing the line and saving in memory

Vector *verticies;

Vector tmp;
verticies = new Vector;

long endPtr = sizeof(verticies);

sscanf(line, "v %f %f %f", &verticies[endPtr].x, &verticies[endPtr].y, &verticies[endPtr].z);

return;

There are eight vertices in the .obj file and the output of sizeof(verticies) shows 8 all the time. The problem with the code above is that the new vertex is given to the last element in *verticies , so my question is; ** how do I add elements to the end of a pointer array dynamically?**

You are allocating space for exactly one Vector struct.

sizeof(vertices) will be the size of a pointer on your machine and is absolutely meaningless here.

sscanf(line, "v %f %f %f", &(verticies->x), &(verticies->y), &(verticies->z));

is going to do what you need. But this only enabling you to read in a single Vector . You either need to allocate enough space (as many vectors as you have lines) and use a for loop to match the line with the offset in the array.

But you really should be using std::vector and a std::ofstream .

sizeof(verticies);

always gives 8, because it is a pointer, size of pointer on your environment is 8.

It does not mean you have 8 vertices.

If you want array of Vector of 8 items, you need to do:

Vector verticies[8];

If you do not know how many Vector items you need to use at compile time you should use,
std::vctor .

You should be using a std::vector for this. (Or some other standard container.)

Nothing in your code contains an array of pointers. All you have is a pointer to a single Vector item that you created with new Vector .

sizeof(vertices) will give you the size of vertices which is a Vector* . So sizeof(vertices) will always return whatever the size of a pointer is on your platform.

Vector *verticies;
verticies = new Vector;

First of all, verticies is not an array of pointers of type Vector . It's just a pointer to Vector . So, when ever you creating a instance, vecticies is pointing to it. Leaving the last instance it was pointing to behind causing memory leak. If you need array of pointers, then it would be -

Vector *verticies[constant];

Since you tagged C++, std::vector is apt for your program.

std::vector <Vector> verticies ;

Now, do a push_back operation for each instance you create.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM