C - 为什么返回int会导致分段错误?

时间:2016-10-19 09:17:22

标签: c

我正在开发一个小型私有项目,该项目从html页面源读取一些链接。我逐行读取html文件,然后检查该行是否包含" data-cfsrc",它始终位于我想要读取的链接之前。这很好用,直到我尝试释放指向关键字(" data-cfsrc")开始的指针。

我已尝试在多个点上释放它,只有当我还没有做任何事情时它才有效。

这是我的代码:

            FILE *fp_w, *fp_r;
            fp_r = fopen("page.html","r");
            fp_w = fopen("bg_list.txt","a");
            char line[1024],img[512],c;
            //char *imgpoint = malloc(sizeof(char)*512);
            char *imgpoint;
            int i,imgcount = 0;

            while(imgcount<15){
                    // read line
                    i = 0;
                    do{
                            c = fgetc(fp_r);
                            line[i] = c;
                            i++;
                    }while(c!='\n');
                    line[i] = '\0';

                    if(strstr(line,"data-cfsrc") != NULL){
                            imgpoint = strstr(line,"data-cfsrc");
                            strcpy(img,imgpoint);
                            c = 0;
                            for(i=0; c!=34; i++){
                                    img[i] = img[i+12];
                                    c = img[i+13];
                            }
                            img[i] = '\0';
                            fprintf(fp_w,"%s\n",img);
                            imgcount++;
                            printf("imgcount = %d\n",imgcount);
                    }
            }
            fclose(fp_r);
            fclose(fp_w);
            //free(imgpoint);

            return 0;
编辑:如上所述,我完全删除了free(),但现在我的程序在调用return时仍会导致Segmentation错误。

编辑2:完全省略了指针指针。一切仍然有效,但返回时仍然会出现Segmentation故障。

1 个答案:

答案 0 :(得分:0)

free()要求您传递malloc()(或朋友)返回的相同指针。但在这里,

imgpoint = strstr(line,"data-cfsrc");

你正在重新分配它。因此,当调用free()时,未定义的行为

来自free()

  

free()函数释放ptr指向的内存空间,          必须由之前调用malloc(),calloc()或          realloc()的即可。否则,或者如果已经调用了free(ptr)          之前,发生未定义的行为。如果ptr为NULL,则不进行任何操作          进行。

(重点补充)。