实现数组转结构体函数时触发栈损坏运行时错误,求排查
栈损坏错误的原因及修复建议
嘿,这个栈损坏的问题其实很好定位——你看你定义的temp_date[2],这个数组只有2个字符的存储空间,但你用它来存日期、月份、年份这些明显不止1-2位的数据,这不越界才怪!
核心问题:数组越界写栈
C语言里栈上的数组是固定长度的,你定义temp_date[2],意味着它只能用下标0和1。但看你的代码逻辑:
- 处理日/月的时候,如果是两位数字(比如"31"或"12"),
t会走到2,这时候你写temp_date[2]就已经超出数组范围了,直接覆盖了栈上相邻变量的内存; - 处理年份的时候更严重,年份是4位数字,你硬往2位的数组里塞,连续越界写好几次,直接把
temp或者循环变量的栈内存搞坏,系统自然就触发了栈溢出检查的错误:Run-Time Check Failure #2 - Stack around the variable 'temp_date' was corrupted.
顺带发现的其他小问题
除了数组越界,你的代码还有几个坑:
- 结构体定义语法错了:
typedef struct char name[16]; int year; int month; int day; c }正确写法应该是typedef struct { char name[16]; int year; int month; int day; } city;(毕竟你的函数返回类型是city) - 给
temp.name加结束符的时候用了NULL,C语言字符串结束符应该是'\0'(虽然部分编译器里两者值相同,但规范上要写'\0') - 你重复给
temp.month赋值了两次,后面的会覆盖前面的结果,逻辑明显有问题
修复建议
- 扩容
temp_date:把它改成char temp_date[5];,足够存4位数字加字符串结束符; - 每次存完数据加结束符:不然
get_number解析的时候可能读到垃圾数据; - 循环里加越界保护:防止
t超过数组最大下标; - 修正结构体和逻辑错误:把重复赋值的问题改掉。
举个修改后的片段例子:
char temp_date[5]; // 扩容到足够存4位数字+结束符 t = 0; // 加个t的上限,防止越界 while (info[i+1]!='/' && t < 4) { temp_date[t] = info[i + 1]; i++; t++; } temp_date[t] = '\0'; // 必须加字符串结束符 temp.day = get_number(temp_date);
这样改完,栈损坏的问题应该就能解决啦!
内容的提问来源于stack exchange,提问作者Eden Meirovich
相关产品推荐
相关产品推荐

