I'm using realloc to increase the amount of memory for an array of structs and it doesn't seem to be increasing at all. I've read all of the posts relating to this and I can't figure out what I'm doing wrong. Here is my code:
struct fileInfo {
char name[MAXNAMLEN];
struct stat stbuf;
};
...
struct fileInfo * newFileInfoPtr;
struct fileInfo * fileInfoPtr = (struct fileInfo *) realloc (NULL, sizeof (struct fileInfo));
// loop through directory to find all filenames
while ((direntPtr = readdir (dirFilePtr)) != NULL) {
(void) strcpy (direntName, filename);
(void) strcat (direntName, "/");
(void) strcat (direntName, direntPtr->d_name);
(void) strcat (direntName, "\0");
// check for vaild file
if (lstat (direntName, &st)) {
if (errno) {
(void) snprintf (buffer, BUFSIZ, STR_LSTAT_ERR);
perror (buffer);
}
exit (EXIT_FAILURE);
}
// reallocate memory for new fileInfo struct
newFileInfoPtr = (struct fileInfo *) realloc (fileInfoPtr,
(count+1) * sizeof (struct fileInfo));
// check for allocation success and increase count
if (newFileInfoPtr != NULL) {
(void) memset (newFileInfoPtr->name, NULL, MAXNAMLEN);
(void) strcpy (newFileInfoPtr->name, direntPtr->d_name);
newFileInfoPtr->stbuf = st;
fileInfoPtr = newFileInfoPtr;
count++;
} else {
if (errno) {
(void) snprintf (buffer, BUFSIZ, STR_ALLOC_ERR);
perror (buffer);
}
exit (EXIT_FAILURE);
}
...
direntPtr is a pointer to an opened directory and I am reading all the names of the files within. That part is working because I can print out the names of each entry. My problem is the final struct array I end up with. I understand with realloc you allocate memory based on the old array, assign the return value to a new pointer, fill the new pointer with information, and set the old pointer to the new pointer. However, after finishing the loop, fileInfoPtr is just one struct. I can access the fields at index 0, but after that they are all empty. I printed out the memory addresses of each index and they are all the same... Thanks for any help
Your newFileInfoPtr
points to the first entry of the newly allocated array. With your memset
and strcpy
calls, you operate on newFileInfoPtr->name
, which overwrites the name of the first entry. You want
(void) memset (newFileInfoPtr[count].name, NULL, MAXNAMLEN);
(void) strcpy (newFileInfoPtr[count].name, direntPtr->d_name);
to access the last entry at index count
(before incrementing).