1

我一头扎进了一个分段错误,我不确定背后的原因。

短篇小说...我将文件名存储到结构的成员中,然后使用这些成员打开文件以将其数据加载到链接列表中。当我只有两个文件时,这工作正常,但是当我添加第三个文件时,打开第一个文件时出现分段错误。

代码有望更好地说明...

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);

...
}

ts 的结构详细信息...

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

systemInit() 看起来很无害,但这里的代码以防万一......

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

加载数据()...

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

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

这就是问题发生的地方......

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))
    {
        ...
    }
...
}

如上,当main 中包含ts->salesFile = "sales.csv"行时,会出现分段错误。如果不是,一切都很好(文件打开,我可以从中读取,写入等)。我一生都无法理解为什么,所以我呼吁您对 C 的良好天性和卓越的知识来解决这个问题的潜在原因。

谢谢!

4

3 回答 3

3

ts未初始化,并按原样使用,在systemInit(). 应该malloc()编..

于 2013-05-11T14:11:49.087 回答
2

改变 TennisStoreType *ts;

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

或者

改变

TennisStoreType *ts;
systemInit(ts);

TennisStoreType ts;
systemInit(&ts);
于 2013-05-11T14:11:45.800 回答
0

您从未真正创建过您的TennisStoreType对象。

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

尝试ts = malloc(sizeof(TennisStoreType))在这两行之间插入。

于 2013-05-11T14:15:06.300 回答