从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 **
问题分析与解决方法
类型不兼容的根源
strcpy是用来复制字符串的函数,它的两个参数都要求是char*类型(指向字符的指针)。但argv本身是char**(指向字符指针的指针),argv + j的结果还是char**类型,和strcpy的参数类型不匹配,这就导致了警告。正确移除数组首个元素的方式
要移除双指针数组的首个元素,本质是把数组中从第二个元素开始的所有指针依次向前移动一位,直接做指针赋值即可,不需要用strcpy:
// 确保数组有至少两个元素才执行移除操作 if (argc > 1) { for (int i = 0; i < argc - 1; i++) { argv[i] = argv[i + 1]; } // 将原最后一个位置置空,避免野指针 argv[argc - 1] = NULL; }
- 代码中其他需要修正的问题
j变量未声明类型,需要加上int;- 直接用
fgets(*argv, 64, stdin)写入argv[0]有风险:argv[0]指向的是程序名的只读内存区域,写入操作可能导致程序崩溃,建议自己分配内存存储输入的字符串; - 原代码的外层for循环和内层while逻辑完全混乱,移除首个元素只需要一次循环完成指针前移即可,不需要嵌套循环。
内容的提问来源于stack exchange,提问作者Erica
相关产品推荐
相关产品推荐

