C语言报错expected ‘char **’ but argument is of type ‘char (*)[10]’求解
问题原因分析
编译警告原因
C语言中数组和指针的类型规则不同:
- main函数中
p的类型是char[10](长度为10的字符数组),对其取地址&p得到的类型是char (*)[10](指向长度为10的字符数组的指针) - 你定义的
mystrcat第一个参数要求是char **(指向字符指针的指针),二者类型完全不匹配,因此编译器抛出对应警告。
运行崩溃原因
有两个核心逻辑错误直接导致崩溃:
- 运算符优先级错误:
*p++等价于*(p++),自增运算符++优先级高于解引用运算符*,你本来想移动p指向的字符指针,实际反而让二级指针p本身向后偏移,直接指向未知的非法内存,后续解引用操作触发野指针访问崩溃。 - 修改数组常量的逻辑错误:数组名是地址常量,其值在程序运行期间不可修改,你想通过传
&p永久修改main中p的值的设计思路本身不成立,数组首地址不能被赋值。
修复方案
采用和标准库strcat一致的实现逻辑即可,不需要使用二级指针:
#include <stdio.h> void mystrcat(char *dest, const char *src) { // 用临时指针遍历,不修改原dest的地址 char *curr = dest; // 移动到dest末尾 while (*curr != '\0') { curr++; } // 拼接src内容 while (*src != '\0') { *curr = *src; curr++; src++; } // 追加字符串结束符 *curr = '\0'; } int main() { char p[10] = "ravi"; char q[12] = "ra"; mystrcat(p, q); printf("%s", p); return 0; }
修复说明
- 数组名
p传参时会隐式转换为指向首元素的char*指针,和mystrcat的第一个参数类型完全匹配,消除编译警告 - 使用临时指针
curr遍历目标缓冲区,不会修改原dest的地址,也规避了运算符优先级错误 - 额外注意:需要保证
dest的缓冲区大小足够容纳拼接后的完整字符串(含末尾\0),避免缓冲区溢出风险。
内容的提问来源于stack exchange,提问作者Ravi
相关产品推荐
相关产品推荐

