user-0 提问: 一个程序Program received signal SIGSEGV, Segmentation fault看了一天了！求救！！！

回复:
user: user-1
content: 假设我输入的年份是1990 那么oneday.year * 365就是708440，按楼主这么原始的做法 work[240000],rest[120000]这两个数组还不够大哟！！ 240000+120000<708440 这就是你崩溃的原因，但不应该用增大分配内存的方式来解决这个问题。因为就你的题目而言，根本没有必要用这么耗时耗内存的方法计算，7楼的方法多好呀

user: user-2
content: // 某年是否是闰年 bool isLeapYear(int y) { 	return ((y % 4 == 0) && (y % 100 != 0)) || (y % 400 == 0); }  // 某年某月有多少天 int daysOfMonth(int y, int m) { 	static int dm[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };  	return dm[m] + ((m == 2 && (isLeapYear(y)) ? 1 : 0)); }  // 某日期在该年的哪一天（即在该年的累计天数） int daysInYear(int y, int m, int d) { 	while (--m > 0) 		d += daysOfMonth(y, m);  	return d; }  // 某年一共有多少天 int totalDaysInYear(int y) { 	return isLeapYear(y) ? 366 : 365; }  // 计算两天相差多少天 int daysBetweenTwoDates(int y0, int m0, int d0, int y1, int m1, int d1) { 	// 如果同年，直接两年的总天数相减 	if (y0 == y1) 		return daysInYear(y1, m1, d1) - daysInYear(y0, m0, d0);  	int days = 0;  	// 不同年，计算除了这两年，中间年份的天数 	for (int y = y0 + 1; y < y1; ++y) 		days += (365 + isLeapYear(y));  	// 计算在这两年里的天数 	days += (daysInYear(y1, m1, d1) + totalDaysInYear(y0) - daysInYear(y0, m0, d0));  	return days; }  // 某人从1990年1月1日起开始"三天打鱼两天晒网"，问这个人在以后的某一天中，是在打鱼还是在晒网？ bool isFishing(int y, int m, int d) { 	return daysBetweenTwoDates(1990, 1, 1, y, m, d) % 5 < 3; }    我尝试写了一个，对所有输入的日期没有做合法性判断，计算两天相差天数也没对日期前后进行判断，你想加上也很容易。 逻辑很简单的，你可以参考下。  其实完全可以写一个日期类，然后重载减号运算符求两个日期之间的天数。通过这个日期类再去实现你的相关需求会很简单。

user: user-3
content: 进程意外退出会在当前目录下产生‘core’文件或形如‘core.数字’的文件比如‘core.1234’ 使用命令 gdb 运行程序名 core或core.数字 进入gdb然后使用bt命令 可以查看进程意外退出前函数调用的堆栈，内容为从上到下列出对应从里层到外层的函数调用历史。 如果进程意外退出不产生core文件，参考“ulimit -c core文件最大块大小”命令

user: user-4
content: Cal n, work[240000],rest[120000]; 这条语句申请的是栈上的空间，栈上的空间是有限的，并且是很少的。一下子申请这么多空间，你是每个都使用了吗？ 如果使用的空间不确定，建议使用动态申请(malloc/free)。 导致段错误的原因也是因为申请这么大的空间导致了越界。

user: user-2
content: 你程序的错误是在函数的堆栈溢出。不明白为啥你分配了那么大空间，没细看你的代码。  如果你用的是VS，想调试你的代码，你可以把“工程属性”->"链接器"->"系统”->"堆栈保留大小”，改大一点，这个数的单位是Byte，1M=1048576Byte。 另外，你的需求很简单啊，为什么代码会这么复杂。

user: user-5
content: 重点是两个日期相差天数, 这个函数网上随处可见, 原理是 基姆拉尔森计算公式 #include <stdio.h>  int day_diff(int year_start, int month_start, int day_start, int year_end, int month_end, int day_end) { 	int y2, m2, d2; 	int y1, m1, d1;  	m1 = (month_start + 9) % 12; 	y1 = year_start - m1/10; 	d1 = 365*y1 + y1/4 - y1/100 + y1/400 + (m1*306 + 5)/10 + (day_start - 1);  	m2 = (month_end + 9) % 12; 	y2 = year_end - m2/10; 	d2 = 365*y2 + y2/4 - y2/100 + y2/400 + (m2*306 + 5)/10 + (day_end - 1);  	return (d2 - d1); }  int main(void) { 	int year, month, day; 	int diff; 	 	scanf("%d %d %d", &year, &month, &day); 	 	diff = day_diff(1990, 1, 1, year, month, day); 	diff %= 5; 	 	if (diff < 3) {printf("fish\n");}  	else {printf("net\n");}  	return 0; }

user: user-0
content: 引用 1 楼 qq_24947841 的回复:没太看懂你Judge函数里的逻辑，只是判断某一天打鱼还是晒网，可以这么做： 比如1995年3月2日，判断这一天到1990年1月1日一共多少天，先看年份（注意判断是否闰年），计算到95年1月1日多少天，再看月份，天数（注意2月），最后求总天数与5的余数，通过余数来判断打鱼还是晒网 恩。。明白你的意思 我的逻辑和你正好相反，我是先用count计数器从1计算到95年1月1日的总天数把他们分别以结构体形式分类到日期里 然后判断是否是3或5的余数，分类为工作日和休息日顺便判断是否是输入天数

user: user-6
content: 没太看懂你Judge函数里的逻辑，只是判断某一天打鱼还是晒网，可以这么做： 比如1995年3月2日，判断这一天到1990年1月1日一共多少天，先看年份（注意判断是否闰年），计算到95年1月1日多少天，再看月份，天数（注意2月），最后求总天数与5的余数，通过余数来判断打鱼还是晒网