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

指针与结构体:为何这段C语言代码无法正常运行?

问题根源:字符串越界覆盖结构体成员

你遇到的问题核心是字符串缓冲区溢出,直接覆盖了结构体里的number_字段:

  1. 结构体定义里的name_[4]只能容纳最多3个可见字符加上字符串结束符\0,但你传入的"Product 1"这类字符串长度远大于4。
  2. strcpy函数不会检查目标缓冲区的大小,它会把整个字符串(包括超出部分)一股脑写入内存,而number_刚好紧跟在name_后面,所以超出的字符直接覆盖了之前赋值好的产品编号。
  3. 至于产品名称能正常打印,是因为printf打印字符串时会一直读到\0才停止——虽然name_本身的缓冲区已经溢出,但后面的内存里刚好有字符串的剩余部分和结束符(这属于未定义行为,换个环境可能就崩了)。

修复方案

有两种常见的解决方式:

  • 直接把name_的数组尺寸改大,比如改成char name_[20];,确保能容纳你要传入的产品名称。
  • 如果要严格控制缓冲区大小,用strncpy代替strcpy,并手动添加结束符,避免溢出:
strncpy(new_product->name_, name, sizeof(new_product->name_) - 1);
new_product->name_[sizeof(new_product->name_) - 1] = '\0';

内容的提问来源于stack exchange,提问作者3nondatur

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 17:18:18