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

从char类型双指针数组移除首个元素时出现指针类型不兼容错误

问题:从char双指针数组移除首个元素时出现类型不兼容错误

我尝试从char类型双指针数组中移除首个元素,但一直报错。输入通过键盘传入argv,main函数代码如下:

int main(int argc, char **argv)
{
    if(!fgets(*argv, 64, stdin))
        return 0;
    for (int i = 0; i < argc; i++)
    {
        int j = 0;      
        while(j < strlen(*argv) - 1)
        {
            if(j == 0)
                strcpy(argv + j, argv + j + 1);
            j++;
        }
    }
}

出现的错误如下:

警告:传递‘strcpy’的参数2时类型不兼容 [-Wincompatible-pointer-types]
22 | { if(j == 0) strcpy(argv + j, argv + j + 1);
| ~~~~~~~^
| |
| char **


问题分析与解决方法

  1. 类型不兼容的根源
    strcpy是用来复制字符串的函数,它的两个参数都要求是char*类型(指向字符的指针)。但argv本身是char**(指向字符指针的指针),argv + j的结果还是char**类型,和strcpy的参数类型不匹配,这就导致了警告。

  2. 正确移除数组首个元素的方式
    要移除双指针数组的首个元素,本质是把数组中从第二个元素开始的所有指针依次向前移动一位,直接做指针赋值即可,不需要用strcpy:

// 确保数组有至少两个元素才执行移除操作
if (argc > 1) {
    for (int i = 0; i < argc - 1; i++) {
        argv[i] = argv[i + 1];
    }
    // 将原最后一个位置置空,避免野指针
    argv[argc - 1] = NULL;
}
  1. 代码中其他需要修正的问题
  • j变量未声明类型,需要加上int;
  • 直接用fgets(*argv, 64, stdin)写入argv[0]有风险:argv[0]指向的是程序名的只读内存区域,写入操作可能导致程序崩溃,建议自己分配内存存储输入的字符串;
  • 原代码的外层for循环和内层while逻辑完全混乱,移除首个元素只需要一次循环完成指针前移即可,不需要嵌套循环。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 11:15:35