Search code examples
cfilecoredump

Coredump in selfmade arrayList


i'm current working on a homework assesment where i'm programming a program ment to stitch textfiles with a piece of an ascii image to create a complete image of all the pieces. The way i intended to write the code is having a while loop looking through a directory finding the parts and adding them to an array. However in my AddFile method(or when i call it to be precise) i get a coredump.. I just started working with c so i dont know if it is very obvious to some of you why i get a coredump or more complicated. Also, i originaly wrote the addFile method to use and accept int's instead of the FILE type, at that point it worked perfectly without any coredumps so i suspect (but hey i might be wrong) that it went wrong when i tried to implement it with the FILE type.

#include <stdio.h>
#include <stdlib.h>

typedef struct{
int listSize;
int listCapacity;
FILE *fileStream;
}FileList;

void addFile(FileList* list, FILE file)
{
    if((*list).listSize<(*list).listCapacity)
    {

        (*list).fileStream[(*list).listSize]=file;
        (*list).listSize+=1;

    }
    else
    {

        FILE *tempArray = calloc((*list).listSize,sizeof(FILE));
        for(int i=0; i<(*list).listSize; i++)
        {
            tempArray[i]=(*list).fileStream[i];
        }
        //Do something with array...
        free((*list).fileStream);

        (*list).listCapacity=((*list).listCapacity)*2;
        (*list).fileStream=calloc((*list).listCapacity,sizeof(FILE)); 
        for(int i=0; i<(*list).listSize; i++)
        {

            (*list).fileStream[i]=tempArray[i];
        }

        (*list).fileStream[(*list).listSize]=file;
        (*list).listSize+=1;

        free(tempArray);
    }

}
int main()
{
    FileList intList;
    intList.listSize=0;
    intList.listCapacity=1;
    intList.fileStream=calloc(intList.listCapacity,sizeof(int));
    int fileYcoord=0;
    int fileXcoord=0;
    while(1)
    {

        char fileName [100];
        int fileNameLength=sprintf(fileName,"part_%02d-%02d",fileXcoord,fileYcoord);
        FILE * pFile = fopen (fileName,"r");
        if(pFile!=NULL)
        {
            printf("- ! found file: %s - name length : %d \n",fileName,fileNameLength);
            addFile(&intList,*pFile);
            fclose(pFile);
            fileXcoord++;
        }
        else
        {
            if(fileXcoord!=0)
            {
                fileYcoord+=1;
                fileXcoord=0;
            }
            else
            {
                break;
            }

        }
    }
    printf("size %d , %d",fileXcoord, fileYcoord);
    free(intList.fileStream);
    return 0;
}

Solution

  • The call to addFile() is dereferencing a FILE *, producing a value of type FILE. This is wrong, this is an opaque type and should always be handled by pointers.