C K& R:printf指针= nil?

时间:2013-11-16 14:48:42

标签: c kernighan-and-ritchie

int *month, *day;

printf("%p,%p\n", month, day);

执行上面的代码示例返回: 0x7fffeda86190,(无)

每当我为* day指针分配内容时,我都会遇到分段错误,如下面的代码所示,来自K& R第5.7章:

造成这种行为的原因是什么?我在哪里可以了解更多有关此类行为的信息?

static char daytab[2][13] = {
    {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
    {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} 
};

int main()
{
    int *month, *day;

    printf("%p,%p\n", month, day);

    month_day(2009, 78, month, day);

    printf("%d,%d\n", *month, *day);

}


int day_of_year(int year, int month, int day)
{
    int i, leap;

    leap = year%4 == 0 && year%100 != 0 || year%400 == 0;
    for (i = 1; i < month; i++)
        day+= daytab[leap][i];
    return day; /*day of the year*/
}
int month_day(int year, int yearday, int *pmonth, int *pday)
{
    int i, leap;

    leap = year%4 == 0 && year%100 != 0 || year%400 == 0;
    for (i = 1; yearday > daytab[leap][i]; i++)
        yearday -= daytab[leap][i];
    *pmonth = i;
    printf("%d,%d\n", *pmonth, yearday);
    *pday = yearday;
}

1 个答案:

答案 0 :(得分:2)

您的monthday指针指向无处(或某个随机位置)。让我们看一下day指针。

*day = value;

当你试图写出day指向的内存时,你的操作系统会发现写入这个地址(0?)是没有意义的,并且会杀死你的程序。

解决方案1:使用malloc动态分配一些内存并指向day

day = (int*)malloc(sizeof(int));
*day = 10; //this is now legal

您还可以使指针指向某个数组内的内存等。

解决方案2:将指向“常规”变量的指针传递给month_day函数:

int mymonth, myday;
month_day(2009, 78, &mymonth, &myday);
// now mymonth and myday should have expected values

希望这有帮助。