我在C
编程时遇到了一个混乱的问题当我使用oldPacket.filename = "fallout.jpg"
//我有一个名为fallout.jpg的文件,以及一个名为oldPakcet且带有char *类型文件名的结构
程序运行良好
现在,我决定让用户输入文件名并检查文件是否存在。我写了以下函数:
bool Searchfile(packet* ptr) {
char userinput[100];
fgets(userinput, sizeof (userinput), stdin); //non terminated input by fgets
userinput[strcspn(userinput, "\n")] = 0;
//printf("%d\n",strlen(userinput));
ptr->filename = userinput + 4;//i skip the first 4 char since the correnct format is ftp <filename>
printf("%s\n",ptr->filename);
printf("%d\n",strlen(ptr->filename));
ptr->filename[strlen(ptr->filename)] = '\0';
if (access(ptr->filename, F_OK) != -1) {
printf("exist\n");
return false;
} else {
//printf("does not exist\n");
return true;
}
}
我通过
调用此函数while (Searchfile(&oldPacket)){
printf("Please input the file name in the format: ftp <file name> \n");
}
然而,程序不再有效,并且在
处显示了seg错误int filesize;
fp = fopen(oldPacket.filename, "rb");
fseek(fp, 0L, SEEK_END);//here is the seg fault
任何人都知道为什么会这样?
我已经打印了文件名的每个字符,它看起来正确....
提前致谢
答案 0 :(得分:2)
您允许ptr->filename
指向局部变量userinput
的地址,并且userinput
超出范围后访问此值是未定义的行为。
段错误的原因可能是filename
的值在Searchfile
之外访问时可能是垃圾,因此文件不会被打开。然后将使用fseek
调用后续NULL
- fp
...
解决此问题的一个简单解决方案是编写static char userinput[100];
,至少在您不在多线程环境中工作时。否则,您必须为ptr->filename
保留内存并复制userinput
的内容。