From: Boyd, T. M. <tm...@cc...> - 2008-06-05 21:18:52
|
> -----Original Message----- > From: min...@li... [mailto:mingw-users- > bo...@li...] On Behalf Of Tuomo Latto > Sent: Thursday, June 05, 2008 3:53 PM > To: MinGW Users List > Subject: Re: [Mingw-users] Linux dirent->d_type ... Windows equivalent? ---8<--- snip > Well, you're not allocating any space for dirent pointer(s) in > namelist. > Anyway, what I was referring to is that after you've allocated memory > for > dirent and assigned the pointer to namelist[n] you then go ahead and > set > namelist[n] to point to the address of the (unallocated and > uninitialized?) > *variable* tempEnt, discarding the pointer to the allocated buffer and > effectively leaking memory. > > The tempEnt assignment has a type mismatch. > With the mismatch, treating namelist[n] a pointer to dirent struct and > writing to its members thrashes the stack variables, probably at least > namelist and n. > > To copy values of tempEnt to namelist[n], you should copy them verbatim > or maybe even use memcpy() (which is likely to be slower). > Remember, this is C and these are pointers, not objects. I have corrected the code before this message in order to properly assign the array pointers. I can get the members of the dirent struct perfectly fine now, but I've run into a different problem. > You seem to be using a table there, but maybe a dynamic structure > would be more appropriate. Of course, a table of pointers allocated > with malloc() can be resized with realloc() and pointers can be copied > freely, but there are alternatives. Agreed, I should be using a dynamic structure. However, the first version of the program will most likely just traverse the directory tree twice--once to count the entries, and the second time to actually grab their attributes. At the risk of veering far off-topic (as far as MinGW is concerned), I'll voice my error if anyone wants to personally reply to my message. I will try to explain my error with the following code and description: [code] struct dirent ** namelist; int n = 0; ... more code here that counts dir entries into variable "n" using readdir() ... namelist = malloc(sizeof(struct dirent) * n); ... code here to reopen directory and start loading file stats ... int a = 0; for( ; a < n; a++) { namelist[a] = readdir(dirToScan); } qsort(namelist, n, sizeof(struct dirent), alphaDirSort); [/code] So, that's basically the layout of my program. (At least, it's the layout of the part that reads the directory tree into an array.) After some debugging, I've found that a segmentation fault occurs when qsort() is called. My alphaDirSort() function is defined as: [code] int alphaDirSort(const void * a, const void * b) { puts("Inside alphaDirSort"); ... code code code ... } [/code] ...but the "Inside alphaDirSort" is never being displayed. Something about one of the parameters I've passed to qsort() is causing qsort() to segfault. I know that namelist[] is being filled with valid dirent structs, since I've tested it with printf("%s\n", namelist[n]->d_name) and it worked fine. I also know that the prototype for my alphaDirSort() function is in line with what qsort() expects to pass array values to. Am I not passing the proper element size to qsort()? Should I de-reference namelist? Again, I'm sorry for getting off-topic. If you feel that posting replies to my query would further deviate from MinGW discussion, please reply to me privately (tmboyd1 at ccis dot edu). Thanks to everyone for all their help! Todd Boyd Web Programmer |