我正在进行一个分段错误,我不确定背后的原因。
简短故事...我将文件名存储到结构的成员中,然后使用这些成员打开文件以将其数据加载到链接列表中。当我只有两个文件时,这工作正常,但是当我去添加第三个文件时,打开第一个文件会出现分段错误。
代码有望更好地说明......
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;
}
loadData()...
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-&gt; salesFile =“sales.csv”行时,会发生分段错误。当它不是,一切都很好(文件打开,我可以从中读取,写入它等)。不能为我的生活理解为什么,所以我对你的良好本性和对C的潜在原因的高级知识很有吸引力。
谢谢!
答案 0 :(得分:3)
ts
未初始化,并在systemInit()
中按原样使用。
它应该是malloc()
..
答案 1 :(得分:2)
变化
TennisStoreType *ts;
到
TennisStoreType *ts=malloc(sizeof(TennisStoreType));
或
更改
TennisStoreType *ts;
systemInit(ts);
到
TennisStoreType ts;
systemInit(&ts);
答案 2 :(得分: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))
。