自定义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,原因很简单:
- 在C语言中,数组作为函数参数传递时会自动退化为指向数组首元素的指针。所以
strcat里的s本质是char*,它直接指向main中str1数组的内存首地址。 - 函数里对
s[i]的赋值操作,直接作用在str1所在的内存空间上,不管函数返回类型是void还是其他,只要你正确遍历并修改了s指向的内存,str1的内容都会被改变。 - 改成
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
相关产品推荐
相关产品推荐

