解决expected 'char * const*' but argument is of type 'char **'

本文最后更新于:3 个月前

在使用exec系列函数时,execleexecvexecvp三个函数,都可以使用char *arg[]传入启动参数。以下面的程序为例,

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(void)
{
int ret;
char *argv[] = {"ls","-l",NULL};
ret = execvp("ls",argv);
if(ret == -1)
perror("execl error");
return 0;
}

编译时就会出现一下,警告,

1
expected 'char * const*' but argument is of type 'const char **'

因为项目中不允许警告产生,所以编译选项是-Werror,所有警告都会被升级成错误。编译时就会产生如下提示,

1
ccl : all warnings being treated as errors

如果是平时练习,改一下编译选项,把这个警告忽略就行,但是现在只能解决。

出现这个问题就是因为定义数组时char *argv[]类型是char **。但是execvp()函数签名是execvp(const char *file, char *const argv[]);第二个参数的类型是char * const *

本以为直接将变量定义更改成char * const argv[]就行了,但是它等价于const char **,所以仍然不能和函数签名匹配。

实在没办法只能改成如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(void)
{
printf("entering main process---\n");
int ret;
char str1[] = "ls";
char str2[] = "-l";
char * const argv[] = {str1, str2, NULL};
ret = execvp("ls",argv);
if(ret == -1)
perror("execl error");
printf("exiting main process ----\n");
return 0;
}

或者在将形参argv进行强制转换。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(void)
{
printf("entering main process---\n");
int ret;
char const *argv[] = {"ls", "-l", NULL};
ret = execvp("ls",(char * const *)argv);
if(ret == -1)
perror("execl error");
printf("exiting main process ----\n");
return 0;
}

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!