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

使用strcpy复制结构体name到字符数组触发运行时错误,如何解决?

问题分析与解决方案

你的问题核心是对strcpy的参数使用完全错误,和数组大小关系不大,咱们一步步拆解清楚:

1. 为什么会触发数组越界错误?

你调用strcpy(highest1[50], l->name);的时候,highest1[50]是在访问数组的第51个元素(C语言数组下标从0开始,highest1[50]的合法下标范围是0到49),这直接超出了数组的边界,所以触发了第一个运行时错误。哪怕你改成char highest1[99];,写highest1[99]同样是越界操作,而且strcpy的第一个参数需要的是指向目标缓冲区的指针,不是单个字符,这就导致了后续的非法操作报错。

2. 正确的基础复制方式

只需要把第一个参数改成数组名highest1就行——因为数组名在大多数情况下会隐式转换成指向数组首元素的指针,刚好符合strcpy的参数要求:

strcpy(highest1, l->name);

3. 更安全的写法(避免缓冲区溢出)

不过这里要注意一个隐藏风险:如果l->name指向的字符串长度超过了highest1的大小(比如超过49,因为还要留一个位置存字符串结束符\0),会导致缓冲区溢出,这是C语言里常见的安全漏洞。所以更稳妥的做法是用strncpy来限制复制的长度,最后手动加上结束符(因为strncpy如果复制满了不会自动加\0):

strncpy(highest1, l->name, sizeof(highest1) - 1);
highest1[sizeof(highest1) - 1] = '\0'; // 确保字符串以结束符收尾,避免乱码

或者你也可以先检查字符串长度,再决定是否复制:

if (strlen(l->name) < sizeof(highest1)) {
    strcpy(highest1, l->name);
} else {
    // 处理字符串过长的情况,比如截断或者报错提示
    fprintf(stderr, "错误:字符串长度超过缓冲区大小\n");
}

总结

你的操作本质是参数传递错误,不是数组定义的问题。修正strcpy的第一个参数为数组名,再额外考虑缓冲区溢出的风险,就能彻底解决问题了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:53:21