问题
Im allocating memory to a double pointer in another function, therefore I need to use a pointer to the pointer to the pointer. Im getting an exception thrown when i use sscanf, im not sure exactly why. Heres a snippet of the code. This was working earlier when it was all in the same function and i only needed to use double pointers, but now that im refactoring the code and using triple pointers im having this issue.
typedef float vector[3]
int mainLoaderFunc() {
char* memory = NULL;
size_t size = loadFile(fileName, &memory); // load model file into memory, this works, tested and true
// create vector arrays
vector *vertexArray = NULL;
vector *normalArray = NULL;
vector *textureArray = NULL;
loadArrays(size, memory, &vertexArray, &normalArray, &textureArray);
// do other stuff with arrays
}
void loadArrays(size_t size, char *memory, vector **vertexArray, vector **normalArray, vector **textureArray) {
int numVerts = 0;
int numNormals = 0;
int numTextures = 0;
char* p = memory; // pointer to start of memory
char* e = memory + size; // pointer to end of memory
// count verts, normals, textures for memory allocation
while (p != e) {
if (memcmp(p, "vn", 2) == 0) {
numNormals++;
} else if (memcmp(p, "vt", 2) == 0) {
numTextures++;
} else if (memcmp(p, "v", 1) == 0) {
numVerts++;
}
while (*p++ != (char) 0x0A);
}
// allocate memory for vector arrays
*vertexArray = new vector[numVerts];
*normalArray = new vector[numNormals];
*textureArray = new vector[numTextures];
p = memory;
int vertexIndex = 0;
int normalIndex = 0;
int textureIndex = 0; //*** IF BREAK POINT HERE: NO EXCEPTION
// load data from memory into arrays
while (p != e) {
if (memcmp(p, "vn", 2) == 0) {
sscanf(p, "vn %f %f %f", &normalArray[normalIndex][0], &normalArray[normalIndex][1], &normalArray[normalIndex][2]);
normalIndex++;
} else if (memcmp(p, "vt", 2) == 0) {
sscanf(p, "vt %f %f", &textureArray[textureIndex][0], &textureArray[textureIndex][1]);
textureIndex++;
} else if (memcmp(p, "v", 1) == 0) {
sscanf(p, "v %f %f %f", &vertexArray[vertexIndex][0], &vertexArray[vertexIndex][1], &vertexArray[vertexIndex][2]);
vertexIndex++;
}
while (*p++ != (char) 0x0A);
}
}
Once the code hits the sscanf part, i get the exception:
Unhandled exception at 0x5e9cf2dc (msvcr100d.dll) in derp.exe: 0xC0000005: Access violation writing location 0xcccccccc.
回答1:
As someone pointed out, you really shouldn't be using triple pointers here.
Additionally, you might want to do your file scanning as something other than chained if-blocks (or at least split it up into functions).
This should fix your issue, since you only have 2 dereferences where you should have 3:
if (memcmp(p, "vn", 2) == 0) {
sscanf(p, "vn %f %f %f", &(*normalArray)[normalIndex][0], &(*normalArray)[normalIndex][1], &(*normalArray)[normalIndex][2]);
normalIndex++;
} else if (memcmp(p, "vt", 2) == 0) {
sscanf(p, "vt %f %f", &(*textureArray)[textureIndex][0], &(*textureArray)[textureIndex][1]);
textureIndex++;
} else if (memcmp(p, "v", 1) == 0) {
sscanf(p, "v %f %f %f", &(*vertexArray)[vertexIndex][0], &(*vertexArray)[vertexIndex][1], &(*vertexArray)[vertexIndex][2]);
vertexIndex++;
}
回答2:
You're passing invalid addresses to sscanf
. Look at one of your function's arguments:
vector **vertexArray
vertexArray
points to the address of a pointer passed from mainLoaderFunc
. *vertexArray
refers to a pointer to an actual vector
array, as you realise when you allocate memory for it:
*vertexArray = new vector[numVerts];
Therefore a valid element in the array would be:
(*vertexArray)[vertexIndex][0]
Note the *
which your code is missing; *vertexArray
refers to the actual array. Now sscanf
wants an address to this variable, so now get the address of it (extra brackets added for the sake of clarity):
&( (*vertexArray)[vertexIndex][0] )
Change all your arguments to sscanf
to be like this one.
回答3:
You are not dereferencing the vector pointers correctly when passing them to sscanf()
. Try this instead:
if (memcmp(p, "vn", 2) == 0) {
sscanf(p, "vn %f %f %f", &((*normalArray)[normalIndex][0]), &((*normalArray)[normalIndex][1]), &((*normalArray)[normalIndex][2]));
++normalIndex;
} else if (memcmp(p, "vt", 2) == 0) {
sscanf(p, "vt %f %f", &((*textureArray)[textureIndex][0]), &((*textureArray)[textureIndex][1]));
++textureIndex;
} else if (memcmp(p, "v", 1) == 0) {
sscanf(p, "v %f %f %f", &((*vertexArray)[vertexIndex][0]), &((*vertexArray)[vertexIndex][1]), &((*vertexArray)[vertexIndex][2]));
++vertexIndex;
}
来源:https://stackoverflow.com/questions/8596563/passing-a-triple-pointer-to-allocate-memory-in-another-function-sscanf-exceptio