Dean Mackenzie
Dean Mackenzie

Reputation: 25

C - segmentation fault using struct member values

I'm running head-long into a segmentation fault that I'm not sure of the reason behind.

Short story... I store file names into members of a struct, then use those members to open files to load their data into linked lists. This is working fine when I only have two file, but when I go to add a third, I get a segmentation fault opening the first file.

Code will hopefully illustrate better...

int main(int argc, char* argv[])
{
    /* Initalise tennisStore struct  */
    TennisStoreType *ts;
    systemInit(ts);

    /* Variables */
    ts->stockFile = "stock.csv";
    ts->custFile = "customer.csv";
    ts->salesFile = "sales.csv";

     /* Load data from files */
     loadData(ts, ts->custFile, ts->stockFile);

...
}

The struct details for ts...

typedef struct tennisStore
{
   CustomerNodePtr headCust;  
   unsigned customerCount;
   StockNodePtr headStock;
   unsigned stockCount;
   char *custFile;
   char *stockFile;
   char *salesFile;
} TennisStoreType;

systemInit() seems pretty innocuous, but here's the code just in case...

void systemInit(TennisStoreType *ts)
{
    /* Set ts options to be ready */
    ts->headCust = NULL;
    ts->headStock = NULL;
    ts->customerCount = 0;
    ts->stockCount = 0;
}

loadData()...

void loadData(TennisStoreType* ts, char* customerFile, char* stockFile)
{
    /* Load customer data */
    addCustNode(ts, customerFile);

    /* Load stock data */
    addStockNode(ts, stockFile);
}

Here's where the problem occurs...

void addStockNode(TennisStoreType* ts, char* stockFile)
{
    /* Variables */
    StockNodePtr head, new, current, previous;
    unsigned stkLevel;
    char *stkTok1, *stkTok2, *stkTok3, *stkTok4;
    char buf[BUFSIZ];
    float stkPrice;
    FILE *stream;

    /* Set head */
    head = NULL;

    /* Open stock file  */
    stream = fopen(stockFile, "r");     <-- segmentation fault when sales.csv line   included
    assert(stream);

    while (fgets(buf, BUFSIZ, stream))
    {
        ...
    }
...
}

As above, when the ts->salesFile = "sales.csv" line is included in main, the segmentation fault occurs. When it isn't, all is fine (file opens, I can read from it, write to it etc). Cannot for the life of me understand why, so I'm appealing to your good nature and superior knowledge of C for potential causes of this problem.

Thanks!

Upvotes: 1

Views: 20685

Answers (3)

xtof pernod
xtof pernod

Reputation: 883

ts is uninitialized, and used as is, in systemInit(). It should be malloc()ed..

Upvotes: 3

BraveNewCurrency
BraveNewCurrency

Reputation: 13065

You never actually created your TennisStoreType object.

int main(int argc, char* argv[])
{
    TennisStoreType *ts;  // <-- allocates 4 bytes for a pointer
    systemInit(ts);       // <-- pass the pointer to nowhere around.

Try inserting ts = malloc(sizeof(TennisStoreType)) in between those two lines.

Upvotes: 0

BLUEPIXY
BLUEPIXY

Reputation: 40145

change TennisStoreType *ts;

to

TennisStoreType *ts=malloc(sizeof(TennisStoreType));

or

change

TennisStoreType *ts;
systemInit(ts);

to

TennisStoreType ts;
systemInit(&ts);

Upvotes: 2

Related Questions