Search code examples
carrayswindowsicc

malloc() causing crash with de-referenced 2-D character array in loop


Arrays is initialized as:

char** aldos = NULL;
char** aldoFilenames = NULL;

Function definition is:

int readFilesFromDirectory(char*** dest, char*** nameDest)

Passed to function via:

readFilesFromDirectory(&aldos, &aldoFilenames);

After counting the files, dest and nameDest are initialized:

*dest = (char**)malloc(sizeof(char*)*count);
*nameDest = (char**)malloc(sizeof(char*)*count);
count = 0; //resetting to read in the files again

First filename for nameDest is read in like:

*nameDest[count] = (char*) malloc(sizeof(char)*strlen(findData.cFileName) + 1);
strcpy(*nameDest[count], findData.cFileName);
//can confirm in my program, the value exists properly in *nameDest[count]
count++;

Heres where the problem comes in, when I throw it in a loop, it crashes (with no real useful error codes):

while (FindNextFile(hfind, &findData) != 0) 
{
  *nameDest[count] = (char*) malloc(sizeof(char)*strlen(findData.cFileName) + 1); //doesnt make it past here, CRASH
   sprintf(*nameDest[count],"%s\0",findData.cFileName);
   count++;
 }

Any insight would be appreciated, I'll be quick to add more information if requested


Solution

  • In *nameDest[count], the indexing operator place before the dereference operator, making the code equivalent to *(nameDest[count]), which is not what you want since nameDest points to the array. You need to do the pointer dereference before the array indexing by using parenthesis: (*nameDest)[count]

    I should also note that polling the OS twice for the directory listing - once for the count and once for the actual names - is unreliable, as between the two polls, the count might have changed. Consider using realloc to resize the array as you find more entries.