You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

实现数组转结构体函数时触发栈损坏运行时错误,求排查

栈损坏错误的原因及修复建议

嘿,这个栈损坏的问题其实很好定位——你看你定义的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赋值了两次,后面的会覆盖前面的结果,逻辑明显有问题

修复建议

  1. 扩容temp_date:把它改成char temp_date[5];,足够存4位数字加字符串结束符;
  2. 每次存完数据加结束符:不然get_number解析的时候可能读到垃圾数据;
  3. 循环里加越界保护:防止t超过数组最大下标;
  4. 修正结构体和逻辑错误:把重复赋值的问题改掉。

举个修改后的片段例子:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:08:52