Closed. This question is
off-topic。它当前不接受答案。
想改善这个问题吗?
Update the question,所以它是
on-topic,用于堆栈溢出。
5年前关闭。
为什么我的主方法无限运行?
为什么在没有进行文件检查的情况下出现分段错误?
我目前正在尝试从Java学习C。我必须说我很困惑,但是越来越好。无论如何,我试图制作一个程序来读取文件并将其存储在链表中(我希望这是我经常做的事情,我希望能够适应使用新语言的情况)。
但是,这在atm上进展不顺利,我现在创建了一小段代码,应该(在我看来,这显然行不通)从文件中读取一行,将其存储在节点中,然后添加列表中的节点,并继续直到文件为空。我也有清单的打印方法。首先,我不断遇到分段错误,由于程序找不到文件,我发现该错误出现了。但是我的完全奇怪的错误使我的朋友惊讶不已,尽管我的朋友比我略胜一筹,但我也试图学到这个错误,这来自我的主要方法:
int main(int argc, char *argv[]){
/*Checks to see if all arguments are being given, ie: program, "print", filename
*/
if(argc<3)
{
printf("The amount of arguments is incorrect");
}
printf("The error has yet to appear");
Node *firstNode=lagLenkeListe(argv[2]);
if(strcmp(argv[1], "print")==0)
{
Node *tempNode=firstNode;
do
{
printf("%s", tempNode->tekststreng);
tempNode=tempNode->neste;
}while(tempNode->neste!=NULL);
}
因为当我运行程序时,它将无限打印printf语句“错误尚未出现”。即使我的主要方法似乎不是循环。而且,如果我跳过该句子,则通过注释掉它,会在lagLenkeListe方法中出现分段错误,并以文件名作为参数。
该方法如下所示:
Node *lagLenkeListe(char *filnavn) {
FILE *file = fopen(filnavn, "rt");
printf("%s", filnavn);
char tekstStreng[512];
char *ftekststreng;
Node *lastNode;
Node *firstNode;
Node *node = malloc(sizeof (Node));
/*Sjekker om fila finnes.
*/
if (access(filnavn, F_OK) != -1) {
while (fgets(tekstStreng, 512, file) != NULL) {
/*
* Hvis lista er tom, så lages den første noden og peker til lista opprettes (firstNode).
*/
if (lastNode->tekststreng == NULL) {
node->neste = NULL;
node->tekststreng = malloc(strlen(ftekststreng) + 1);
node->tekststreng = ftekststreng;
firstNode = node;
lastNode = node;
} else {
node->tekststreng = malloc(strlen(ftekststreng) + 1);
node->tekststreng = ftekststreng;
lastNode->neste = node;
}
lastNode = node;
printf("%s", "Tjalabajs");
}
fclose(file);
} else {
printf("%s", "Fila finnes ikke\n");
}
return firstNode;
}
我添加了
F_OK
来查看是否可以打开文件,但不能打开。
我100%确信文件在正确的文件夹中,并且我使用以下命令启动程序:
./readFromFile print filename.txt
所以我尝试更改文件名,
print
给定的文件名等。
它给了我几行混乱,向我表明它没有正确获取文件名。
因此,我尝试从将
argv[2]
存储在文件名字符串中更改为将其传递为传递
argv[2]
。
现在,我在运行时遇到了分段错误,根本没有涉及lagLenkeListe方法。
如果我在任何时候都不清楚:
为什么我的主方法无限运行?
为什么在没有进行文件检查的情况下出现分段错误?
为什么我的主方法无限运行?
lastnode
和firstnode
在使用前未分配,因此它们可以指向任何地方。这可能导致读取循环永远不会分配firstnode
,以使返回的指针指向随机存储器位置。
Node *lastNode = NULL;
Node *firstNode = NULL;
并更改对lastnode的检查:
if (lastNode == NULL) {
为什么在没有进行文件检查的情况下出现分段错误?
您需要检查
fopen
的返回值:
FILE *file=fopen(filnavn, "rt");
/* if(access(filnavn, F_OK)!=-1){ Wrong way to do it! */
if (file != NULL) { /* Better way to do it */