指针与结构体:为何这段C语言代码无法正常运行?
问题根源:字符串越界覆盖结构体成员
你遇到的问题核心是字符串缓冲区溢出,直接覆盖了结构体里的number_字段:
- 结构体定义里的
name_[4]只能容纳最多3个可见字符加上字符串结束符\0,但你传入的"Product 1"这类字符串长度远大于4。 strcpy函数不会检查目标缓冲区的大小,它会把整个字符串(包括超出部分)一股脑写入内存,而number_刚好紧跟在name_后面,所以超出的字符直接覆盖了之前赋值好的产品编号。- 至于产品名称能正常打印,是因为
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
相关产品推荐
相关产品推荐

