免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5029 | 回复: 12
打印 上一主题 下一主题

[C] [求助] 关于回调函数,为什么会出现段错误啊??? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-07-25 22:14 |只看该作者 |倒序浏览

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

typedef struct list{
        void *value_address;
        struct list *next;
}NODE;

int compare(void const *a, void const *b){
        if (*(int *)a == *(int *)b)
                return 0;
        else
                return -1;
}

NODE *Search_List(NODE *node, int (*compare)(void const *, void const *) , void const *desired_value){
        while (node != NULL){
                if (compare((node->value_address), desired_value) == 0)
                        break;
                node = node->next;
        }
        return node;
}

int main(){
        
        NODE *desired_node,*head,*p;
        int desired_int_value = 5;
        FILE *fp;
        
        head = (NODE *)malloc(sizeof(NODE));
        head->value_address =NULL;
        head->next = NULL;
        p = head->next;

        if( (fp = fopen("t.txt","r")) == NULL ){
                perror("fopen");
                exit(-1);
        }
        
        while(feof(fp)==0){
                p = (NODE *)malloc(sizeof(NODE));
                printf("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$\n");
                printf("%p\n",p->value_address);//地址为空。为什么啊???
                fscanf(fp,"%d",(int *)p->value_address);//段错误应该在这里
                printf("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&\n");
                p = p->next;
        }
        desired_node = Search_List(head, compare, &desired_int_value);

        printf("%d\n",*(int *)desired_node->value_address);
        
        return 0;
}

论坛徽章:
154
2022北京冬奥会纪念版徽章
日期:2015-08-07 17:10:5720周年集字徽章-年
日期:2022-10-26 16:44:2015-16赛季CBA联赛之深圳
日期:2022-11-02 14:02:4515-16赛季CBA联赛之八一
日期:2022-11-28 12:07:4820周年集字徽章-20	
日期:2023-07-19 08:49:4515-16赛季CBA联赛之八一
日期:2023-11-04 19:23:5115-16赛季CBA联赛之广夏
日期:2023-12-13 18:09:34
2 [报告]
发表于 2014-07-26 08:00 |只看该作者
head->next = NULL;
        p = head->next;


现在 p已经是空指针了哦

论坛徽章:
0
3 [报告]
发表于 2014-07-26 09:17 |只看该作者
本帖最后由 大众推荐 于 2014-07-26 09:52 编辑

               p = (NODE *)malloc(sizeof(NODE));
                printf("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$\n");
                printf("%p\n",p->value_address);//地址为空。为什么啊???
                fscanf(fp,"%d",(int *)p->value_address);//段错误应该在这里
                printf("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&\n");

p 是刚malloc出来而没有 memset 的,p->value_address 即使不是空(dirt data),也不是你想要的。
你想要的是&(p->value_address)?

论坛徽章:
0
4 [报告]
发表于 2014-07-26 09:25 |只看该作者
另外,从代码上来看,根本没有形成一个链表。

p = head->next;

应该是在MALLOC出第 二 个NODE以后,
head->next = p ;// the first node will be only header but not a REAL node. Is that what you want?

论坛徽章:
0
5 [报告]
发表于 2014-07-26 09:32 |只看该作者
desired_node = Search_List(head, compare, &desired_int_value);

        printf("%d\n",*(int *)desired_node->value_address);


而  Search_List 返回的应该是一个NULL,即desired_node = NULL;
desired_node->value_address 当然是不可以的。。

论坛徽章:
0
6 [报告]
发表于 2014-07-26 10:24 |只看该作者
)
几点建议:
1.malloc()是不保证成功的,返回值应该检查。

2.malloc()返回值成功,不是NULL,也不一定是可用的,即使你用了没有挂,也不知道什么时候会挂,
   比如说,有人蛋痛的使用 p = malloc(0);,是有返回值的,可能是空,也可能是一个有效地址,而且是一个你可以使用的地址,也可free()。。。
   但是,p->next之类的空间,会否一样可以被别人malloc拿去用了?具体没有深究。

3.函数的接收到的参数,如果是指针,最好检查了再用。别节约那一点性能。除非,你可以假设
  A.我的API一定没问题。
  B.使用该API的人都是可以确保不会传入无效参数。
类似某些LIBC的API。

4.最好使用malloc()出来的空间之前,memset()之类的清零一下。或者使用 calloc()之类的。

5.检查函数返回值。

6.指针类型的返回值,如果API和CALLER不在同一个文件之类的,一定要显式声明返回值类型。
这点,可能大部分时候你体会不到。不过,当你的程序在不同的机器之间移植,比如32BIT,64BIT,使用的时候,这样的忽略将是很头疼的,因为你永远不知道,什么时候会出差。

做到上面几点,会减少很多 奇怪的错误。

论坛徽章:
0
7 [报告]
发表于 2014-07-27 07:46 |只看该作者
本帖最后由 dezhihuang 于 2014-07-27 07:48 编辑



       !

论坛徽章:
0
8 [报告]
发表于 2014-07-27 07:47 |只看该作者

"Search_List 返回的应该是一个NULL",请问为什么呢?该怎没改啊???回复 5# 大众推荐


   

论坛徽章:
0
9 [报告]
发表于 2014-07-27 07:55 |只看该作者
根本没有形成一个链表,,,,,怎么改才是对的啊???初学者,不太懂啊!回复 4# 大众推荐


   

论坛徽章:
0
10 [报告]
发表于 2014-07-27 10:51 |只看该作者
1.因为你的head->next 没有指向小一个NODE,所以没有成为一个链表。
2.head->next = NULL, Search_List 返回了 node->next,即是 NULL。
3. desired_node = NULL;
    printf("%d\n",*(int *)desired_node->value_address);
    Segmentation fault.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP