为什么我的指针被初始化为 0x0?
Why is my pointer being initialized to 0x0?
我一直在阅读 K&R 第 2 版书籍,但我一直在尝试将其中一个示例正确地 运行。
直接取自本书第5章的代码(我在main中添加了一些随机变量):
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}
};
/* day_of_year: set day of year from 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;
}
/* month_day: set month, day from day of year */
void 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;
*pday = yearday;
}
int main(){
int x = 5, y = 10;
int *q, *p;
month_day(x, y, q, p);
}
这个程序给我分段错误,所以我尝试 运行在 gdb 中安装它。
我在 month_day 函数中放置了一个断点,立即引起了我的注意。
gdb 显示 pmonth 被初始化为某个地址,但 pday 被初始化为 0x0。这不可能是对的,我知道,但首先是什么原因造成的?
这是 month_day 函数及其在 gdb 中的参数:
month_day (year=5, yearday=10, pmonth=0x7fffffffe150, pday=0x0) at e5-8.c:19
正如预期的那样,当尝试打印 *pmonth 时,它可以正常工作,但打印 *pday 却不能,因为它已初始化为 0x0。
gdb 输出:
19 leap = year%4 == 0 && year%100 != 0 || year%400 == 0;
(gdb) print pday
= (int *) 0x0
(gdb) print *pday
Cannot access memory at address 0x0
(gdb) print *pmonth
= 1
这很可能是一个简单的修复,但我也想了解发生了什么!
您需要传递有效地址。也许你只是想要:
int main(void){
int x = 5, y = 10;
int q, p;
month_day(x, y, &q, &p);
}
我一直在阅读 K&R 第 2 版书籍,但我一直在尝试将其中一个示例正确地 运行。
直接取自本书第5章的代码(我在main中添加了一些随机变量):
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}
};
/* day_of_year: set day of year from 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;
}
/* month_day: set month, day from day of year */
void 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;
*pday = yearday;
}
int main(){
int x = 5, y = 10;
int *q, *p;
month_day(x, y, q, p);
}
这个程序给我分段错误,所以我尝试 运行在 gdb 中安装它。
我在 month_day 函数中放置了一个断点,立即引起了我的注意。
gdb 显示 pmonth 被初始化为某个地址,但 pday 被初始化为 0x0。这不可能是对的,我知道,但首先是什么原因造成的?
这是 month_day 函数及其在 gdb 中的参数:
month_day (year=5, yearday=10, pmonth=0x7fffffffe150, pday=0x0) at e5-8.c:19
正如预期的那样,当尝试打印 *pmonth 时,它可以正常工作,但打印 *pday 却不能,因为它已初始化为 0x0。
gdb 输出:
19 leap = year%4 == 0 && year%100 != 0 || year%400 == 0;
(gdb) print pday
= (int *) 0x0
(gdb) print *pday
Cannot access memory at address 0x0
(gdb) print *pmonth
= 1
这很可能是一个简单的修复,但我也想了解发生了什么!
您需要传递有效地址。也许你只是想要:
int main(void){
int x = 5, y = 10;
int q, p;
month_day(x, y, &q, &p);
}