C K&R : printf pointer = nil?

标签 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;
}

最佳答案

您的 monthday 指针指向任何地方(或某个随机位置)。让我们看一下 day 指针。

*天=值;

当您尝试写入由 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

希望这对您有所帮助。

关于C K&R : printf pointer = nil?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20019754/

相关文章:

c - 为什么时间不断变化?

C编程-温度转换问题

c - 函数声明与原型(prototype)的替代 (K&R) C 语法

c - Quake 反平方根 : accuracy

c - 如何修复 C 中格式不一致或冗余的 char 'c'?

c - 什么是 ubuntu 中的 EOF 以及 Kernighan 和 Ritchie

c - 在 C 中将整数添加到 char

c - "The C Programming Language"的非常基本的示例代码没有按预期工作?

c - 什么是尾随空格和制表符? K&R 练习 1.18

c - 用 C 编写一个简单的 voip 应用程序