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

自定义strcat函数出现间接寻址不匹配错误及返回类型修改相关技术疑问

自定义strcat实现的编译错误及相关疑问解析

一、编译错误的根源

你碰到的这个错误,核心是自定义的strcat和C标准库的同名函数签名冲突了:

  • C标准库(<string.h>里)的strcat原型是:char *strcat(char *dest, const char *src);,它会返回指向目标字符串dest的指针。
  • 而你自己写的strcat返回类型是void,参数也没给源字符串加const修饰。
  • 当你在main里调用strcat(str1, str2)时,编译器会优先识别标准库的strcat声明(哪怕你没显式包含<string.h>,很多编译器会隐式提供常用库函数的声明),这时它发现你调用的函数和标准库的签名(返回类型、参数属性)完全不匹配,就会抛出“不同间接级别”的错误——本质是编译器无法匹配到正确的函数,认为你的调用存在类型不兼容的问题。

二、关于返回类型与数组修改的澄清

你的理解其实走进了误区,根本不需要用void*返回才能修改str1的内容,原来的void strcat(char s[], char t[])版本本身就可以修改str1,原因很简单:

  1. 在C语言中,数组作为函数参数传递时会自动退化为指向数组首元素的指针。所以strcat里的s本质是char*,它直接指向main中str1数组的内存首地址。
  2. 函数里对s[i]的赋值操作,直接作用在str1所在的内存空间上,不管函数返回类型是void还是其他,只要你正确遍历并修改了s指向的内存,str1的内容都会被改变。
  3. 改成void*后编译错误消失,只是因为这个修改让自定义函数和标准库strcat的签名差异更大,编译器不再把两者混淆,但这和能不能修改str1没有半毛钱关系。

举个直观的例子:如果你把自定义函数改名叫my_strcat,哪怕返回类型还是void,编译错误会立刻消失,而且照样能正确修改str1的内容——因为此时不会和标准库的strcat重名冲突了。

另外提个小bug:你初始的strcat实现里,第一个while循环用了++i,会跳过s[0]直接从s[1]开始判断,正确的写法应该是while (s[i] != '\0') i++;。而且你初始化str1的时候只给了'a'到'd',没加'\0',这会导致第一个循环越界,也是需要修正的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 17:09:04