这是一个简单的函数month_day
,它将一年中的某一天转换为月和日。这是来自C教程的一些修改。
我不知道,当我跑步时,我得到了
"....... Access violation at address 004011DD ....." error stopping at
*month=i; //in daytellerlib.c file.
这是两个文件中的完整程序。文件1:
#include<stdio.h>
#include<conio.h>
#include"daytellerlib.c"
int main()
{
int dayyear,year;
int *pday=0;
int *pmonth=0;
dayyear=99;
year=2011;
month_day(dayyear,year,pmonth,pday);
printf("dayyear=%d YEar=%d day=%d month=%d \n",dayyear,year,*pday,*pmonth);
getch();
return 0;
}
文件2:
void month_day(int day,int year,int *,int *);
static table[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}
};
void month_day(int dayyear,int year,int *month,int *day)
{
int i=1,count=0,leap;
leap = year%4 == 0 &year%100 != 0 || year%400 == 0;
for(;dayyear>(count+=table[leap][i]);i++)
;
*month=i;
*day=dayyear+table[0][i]-count;
}
我知道这是因为我们正在访问具有其他地址的指针。
答案 0 :(得分:8)
当您致电month_day()
时,您正在将指针传递给没有与之关联的整数的整数。
int day;
int month;
int * pday = &day;
int * pmonth = &month;
或更简单
int day;
int month;
month_day(dayyear, year, &month, &day);
更新:正如@Eran Zimmerman指出的那样,你应该使用&amp;&amp; (逻辑AND)代替&amp; (按位AND)计算跳跃时。