C语言调用execv报incompatible pointer type错误不修改二维数组解决方案咨询
问题解决方法
报错原因
- 第一次调用
execv(a[0], a)的错误:- 二维字符数组
char a[3][50]的数组名退化为指针时是char (*)[50]类型(指向长度为50的字符数组的指针),和execv要求的第二个参数char *const argv[](字符串指针数组)类型完全不兼容,因此会报incompatible pointer type错误。 a[2] = NULL是非法操作:a[2]是长度为50的字符数组实体,不是指针变量,不能直接赋值为NULL。
- 二维字符数组
- 你第二次尝试的写法类型逻辑本身是正确的,如果仍报错一般是两个原因:
- 没有引入必要的头文件,编译器对
execv做隐式声明导致类型判定错误 execv要求第一个参数传入可执行文件的绝对路径,直接传"ping"会因为找不到可执行文件调用失败,要么写全路径,要么改用execvp自动搜索PATH路径下的可执行文件。
- 没有引入必要的头文件,编译器对
可行解决方案(完全保留a[n][50]存储结构)
不需要修改你原有用二维数组存参数的逻辑,只需要额外构造一个等长的指针数组做参数转换即可,完整可运行代码如下:
#include <unistd.h> #include <string.h> int main(int argc, char const *argv[]) { // 你的原有存储逻辑完全不变 char a[3][50]; strcpy(a[0], "ping"); strcpy(a[1], "google.com"); // 构造适配execv/execvp的指针数组,长度和a的第一维长度一致即可 char *args[sizeof(a)/sizeof(a[0])]; for (int i = 0; i < sizeof(a)/sizeof(a[0]) - 1; i++) { args[i] = a[i]; } // 最后一个参数置为NULL,符合exec系列函数的参数要求 args[sizeof(a)/sizeof(a[0]) - 1] = NULL; // 写法1:用execvp,不需要写ping的绝对路径,自动搜索PATH execvp(args[0], args); // 写法2:如果一定要用execv,写死ping的绝对路径即可(Linux下一般是这个路径) // execv("/usr/bin/ping", args); return 0; }
适配动态参数数量的写法
如果你的参数数量是运行时动态确定的n,只需要把指针数组改成动态申请即可,原有a[n][50]的存储逻辑依然不用改:
// 假设运行时得到参数数量为n,a[n][50]已经填充好参数 char **args = malloc((n + 1) * sizeof(char*)); for (int i = 0; i < n; i++) { args[i] = a[i]; } args[n] = NULL; execvp(args[0], args); // 调用失败的话释放内存 free(args);
内容的提问来源于stack exchange,提问作者digolira2
相关产品推荐
相关产品推荐

