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

C语言报错expected ‘char **’ but argument is of type ‘char (*)[10]’求解

问题原因分析

编译警告原因

C语言中数组和指针的类型规则不同:

  • main函数中p的类型是char[10](长度为10的字符数组),对其取地址&p得到的类型是char (*)[10](指向长度为10的字符数组的指针)
  • 你定义的mystrcat第一个参数要求是char **(指向字符指针的指针),二者类型完全不匹配,因此编译器抛出对应警告。

运行崩溃原因

有两个核心逻辑错误直接导致崩溃:

  1. 运算符优先级错误:*p++等价于*(p++),自增运算符++优先级高于解引用运算符*,你本来想移动p指向的字符指针,实际反而让二级指针p本身向后偏移,直接指向未知的非法内存,后续解引用操作触发野指针访问崩溃。
  2. 修改数组常量的逻辑错误:数组名是地址常量,其值在程序运行期间不可修改,你想通过传&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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 15:06:01