使用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
相关产品推荐
相关产品推荐

