程序崩溃(0xC0000005)排查:如何将整数值与当前小时相加并显示时间?
问题解决:程序崩溃与唤醒时间计算修正
一、崩溃原因(错误码0xC0000005)
错误码0xC0000005是非法内存访问,根源在这行代码:
struct tm tm = *localtime(&t);
localtime(&t)可能返回NULL(比如time(NULL)获取时间失败时),直接解引用NULL指针会触发内存访问违规。此外,time(NULL)也可能返回(time_t)-1表示获取时间失败,同样需要检查。
二、修复崩溃+正确计算唤醒时间的代码调整
修改sleepDuration函数,补充有效性检查并采用时间戳方式计算唤醒时间:
void sleepDuration(int *sleep) { int sleepAmount; time_t t = time(NULL); // 检查系统时间获取是否成功 if (t == (time_t)-1) { printf("Failed to get current time!\n"); return; } struct tm *tm_ptr = localtime(&t); // 检查本地时间转换是否成功 if (tm_ptr == NULL) { printf("Failed to convert time to local time!\n"); return; } struct tm tm = *tm_ptr; printf("Current time: %02d:%02d:%02d\n", tm.tm_hour, tm.tm_min, tm.tm_sec); printf("How many hours do you want to sleep? "); // 检查输入是否为有效整数 if (scanf("%d", &sleepAmount) != 1) { printf("Invalid input! Please enter an integer.\n"); // 清除输入缓冲区的无效数据 while (getchar() != '\n'); return; } // 用时间戳计算唤醒时间:自动处理跨天/跨月情况 time_t wake_up_time = t + sleepAmount * 3600; struct tm *wake_tm = localtime(&wake_up_time); if (wake_tm == NULL) { printf("Failed to calculate wake-up time!\n"); return; } // 更新睡眠需求值 *sleep += sleepAmount; printf("After sleeping for %d hours, sleep need is: %d\n", sleepAmount, *sleep); printf("Wake-up time: %04d-%02d-%02d %02d:%02d:%02d\n", wake_tm->tm_year + 1900, wake_tm->tm_mon + 1, wake_tm->tm_mday, wake_tm->tm_hour, wake_tm->tm_min, wake_tm->tm_sec); }
三、关键优化点
- 避免空指针崩溃:增加
time()和localtime()的返回值检查,防止非法内存访问。 - 正确处理跨天时间:将时间转换为秒级时间戳,加上睡眠时长的秒数后再转回本地时间结构体,自动处理跨天、月份甚至年份的变化,替代简单累加小时数的不合理方式。
- 输入合法性校验:检查
scanf返回值,确保用户输入有效整数,同时清除输入缓冲区的无效数据,避免后续输入异常。 - 时间字段修正:
struct tm的tm_year是1900年起的偏移量,需加1900得到实际年份;tm_mon是0-11的范围,需加1得到实际月份。
内容的提问来源于stack exchange,提问作者Mehmet Emin
相关产品推荐
相关产品推荐

