分段错误 - 我如何弄清楚我的代码有什么问题? - C

时间:2016-04-04 08:05:25

标签: c pointers segmentation-fault

我对编程非常陌生并且正在尝试制定一个程序。但是,我没有得到任何有用的错误。该程序编译,但我在执行中途收到“分段错误”消息。在这个程序中,我要求输入一个月和一天,然后调用一个函数(我的计划是传递日期字符串,以及tempmonth数组的地址和tempday整数),将日期分为月份和一天,并将它们存储在地址中。然后在main中打印数据。我已经花了好几个小时来弄清楚我在指针和地址上做错了什么......但我无法理解它。这是整个代码:

#include <stdio.h>
void separate(char*,char*,int*);

int main()

{    

        char date[12];
        printf("Enter a month and a day: ");
        fgets(date,12,stdin);

        char tempmonth[10];
        int tempday;
        separate(date,&*tempmonth,&tempday);

        printf("month is %s and day is %d",tempmonth,tempday);

        return 0;
}

void separate(char*date,char*tempmonth, int*tempday)

{

        sscanf(date,"%s %d",*tempmonth,*tempday);
}

(由于某种原因,*不会通过char date和char tempmonth打印 - 它应该在那里。) 提前谢谢你:)

3 个答案:

答案 0 :(得分:7)

编译器可能会向您显示如下警告:

  

‘%s’期望类型‘char*’的参数,但参数3具有类型   ‘int’

     

‘%d’期望类型‘int*’的参数,但参数4具有类型   ‘int’

由于sscanf指针作为参数传递给int,这就是创建Segmentation fault (core dumped)的原因。您正在访问您的计划可能无法访问的地址*tempmonth(存储在tempmonth中的值)。无法访问意味着该地址不属于操作系统提供给您的程序的内存,或者该进程没有访问它所需的权限。

更改行

sscanf(date,"%s %d",*tempmonth,*tempday);

sscanf(date,"%s %d",tempmonth,tempday);

因为tempmonthtempday已经是指针。

同样在调用separate(date,&*tempmonth,&tempday);时,&*tempmonthtempmonth相同,因为您正在引用和取消引用相同的指针;两者都会取消。

答案 1 :(得分:1)

  

分离(日期,&安培; * tempmonth,&安培; tempday);

&*tempmonth是tempmonth指向的对象的地址...这是tempmonth,所以&*tempmonth - &gt; tempmonth

  

sscanf(日期,“%s%d”,* tempmonth,* tempday);

sscanf需要存储数据的地址。由于tempmonth是指向链的第一个字符的指针,*tempmonth是您链中的第一个字符。与tempday相同,它已经是地址,意味着*tempday是实际值。因此,请将此行更改为:

sscanf(date,"%s %d",tempmonth, tempday);

答案 2 :(得分:0)

你应该缩小问题:导致分段错误的是什么线?
要回答这个问题,使用经验来猜测或者你可以使用像gdb这样的调试器,你可以在一行中插入一个断点,当程序运行并到达此行时,它将停止并且您将控制执行,您将能够逐步执行您的程序。
在您的示例中,尝试在函数中单独插入断点 现在您将看到当您的操作系统执行sscanf,搜索sscanf的原型,比较您传递的参数类型与sscanf所期望的内容时,会发生分段错误。您将解决问题。
`