问题描述:

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!

网友答案:

change TennisStoreType *ts;

to

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

or

change

TennisStoreType *ts;
systemInit(ts);

to

TennisStoreType ts;
systemInit(&ts);
网友答案:

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

网友答案:

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.

相关阅读:
Top