程序报“Segmentation fault”,求解。

来源:互联网  时间:2016/8/5 16:51:40

关于网友提出的“ 程序报“Segmentation fault”,求解。”问题疑问,本网通过在网上对“ 程序报“Segmentation fault”,求解。”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:

问题: 程序报“Segmentation fault”,求解。
描述:

大伙儿帮帮忙,看一下俺笨笨的一些代码。
不知道哪里出错,老报“Segmentation fault”。
用gcc可以编译通过,调试或运行都报如上信息。gdb定位不到。
#include 
#include 
#include 
#define MAX_FILENAME_LEN 256
#define TRUE 1
#define FALSE 0
struct playlist
{
unsigned int number;
char src_filename[MAX_FILENAME_LEN];
struct playlist* next;
};
struct playlist *head ;
int createPlaylist();
int showPlaylist();
int main(int argc,char *argv[]) 
{
int choice;
int bFound = FALSE;
char default_filename[MAX_FILENAME_LEN]="/home/myprg/";
char src_filename[MAX_FILENAME_LEN];
createPlaylist();
printf("The list is: \n");
showPlaylist();
printf("Input your choice: ");
scanf("%d", &choice);
while (choice < 0 && choice > 9)
{
printf("You input a wrong character, please input a number...");
scanf("%d", &choice);
}
while(head)
{
if (head->number == choice)
{
strcpy(src_filename, head->src_filename);
strcat(default_filename, src_filename);
strcpy(src_filename, default_filename);
printf("%s", src_filename);
printf("%d", strlen(src_filename));
bFound = TRUE;
break;
}
head = head -> next;
}
if (bFound == FALSE)
strcpy(src_filename,"/home/myprg/test.png");  //default
printf("Your choice is :%s", src_filename);
FILE *fp = fopen(src_filename, "rb+");
if (fp != NULL)
{
printf("Can open the file...\n");
}
fclose(fp);
return 0;
}
int createPlaylist()
{
struct playlist *pS;
struct playlist *pEnd;
pS = malloc(sizeof(struct playlist));
//open a file 
FILE *fp = fopen("listinfo.txt", "r");
if ( !fp )
{
printf("fail to open the file!\n");
return 1;
}
char buffer[MAX_FILENAME_LEN];
int i=1;
fgets(buffer, sizeof(buffer),fp);
pS->number = i;
strcpy(pS->src_filename, buffer);
head = NULL;
pEnd = pS;
while (fgets(buffer, sizeof(buffer),fp) != NULL)
{
if (head == NULL)
{
head = pS;
}
else
pEnd->next = pS;
pEnd = pS;
pS = malloc(sizeof(struct playlist));
i ++;
pS->number = i;
strcpy(pS->src_filename, buffer);
}
pEnd->next = NULL;
free(pS);
fclose(fp);
}
int showPlaylist()
{
struct playlist *pS;
pS = malloc(sizeof(struct playlist));
pS = head;
while(head)
{
printf("<%d>", head->number);
printf("%s\n", head->src_filename);
head = head-> next;
}
head = pS;
return 0;
}


解决方案1:

用这个system("ls *.png > listinfo.txt")的时候,那么在每一行会多出一个换行符号,那么你在
strcat(default_filename, src_filename);
strcpy(src_filename, default_filename);
的时候自燃也把这个换行符包含进去了,所以在你后面打开的时候就不会是这个文件了
建议在
strcpy(src_filename, head->src_filename);
strcat(default_filename, src_filename);
strcpy(src_filename, default_filename);
后加上这句
src_filename[strlen(src_filename) - 1] ='\0';

解决方案2:

if (fp != NULL)
{
printf("Can open the file...\n");
}//要是不存在这个文件呢?
if (!fp)
{
      printf("can not open the file.\n");
      exit(1);
}
else
    printf("Can open the file...\n");
fclose(fp);

解决方案3:

pS = malloc(sizeof(struct playlist));
我的意思是对于这个申请没有任何必要
遍历链表只要将pS = head;
然后对pS进行遍历,head依然不变
或者pS = head;后用head遍历再将head = pS;
后者就有点多余了, 申请空间你是不是觉得完全没有必要啊

上一篇这个错误什么意思阿?(内详)
下一篇请教关于头文件的错误!!
明星图片
相关文章
《 程序报“Segmentation fault”,求解。》由码蚁之家搜集整理于网络,
联系邮箱:mxgf168#qq.com(#改为@)