我需要创建一个char * array []然后我必须传递给execv。
然后是NULL
void perform_exec(){
char *type= 'A' + (random() % 2);
char *name= 'A' + (random() % 64);
int rand_num= rand();
char *args[5];
args[0]= "./test_exec";
args[1]= name;
args[2]= type;
args[3]= rand_num;
args[4]= NULL;
execv(args[0], args);
printf("you souldn't see this. exec error\n");
exit(EXIT_FAILURE);
}
我知道这段代码存在严重错误,但实际上无法弄清楚它是什么。
我收到错误#014:地址错误。
答案 0 :(得分:1)
<强> i get Error #014: Bad address.
强>
错误消息非常清楚,您的程序正在尝试使用无效的地址。
errno
14代表EFAULT
。
来自execve
EFAULT
文件名指向可访问的地址空间之外。
由于这些陈述,您的程序会抛出此错误:
args[1]= name;
args[2]= type;
args[3]= rand_num;
此处args
的类型为char (*)[]
,它是char
指针的数组。
因此,您要为char
指针分配整数类型值,编译器必须为此提供警告。
execv()
访问传递给它的参数,并且它正在提出Bad address
错误,因为它正在考虑args[1]
(name
),args[2]
({{ 1}})和type
(args[3]
)作为地址,并尝试访问那些无效的地址值。
你可以这样做:
rand_num
其他:
运行程序时,您必须为void perform_exec(){
char type= 'A' + (random() % 2);
char name= 'A' + (random() % 64);
int rand_num= rand();
char *args[5];
args[0]= "./test_exec";
args[1] = malloc (2 * sizeof(char)); //2 as it is either A or B
args[1][0] = type;
args[1][1] = '\0';
args[2] = malloc (2 * sizeof(char)); //2 as it is a character
args[2][0] = name;
args[2][1] = '\0';
args[3] = malloc (11 * sizeof(char)); //11 as INT_MAX is having 10 digits
snprintf (args[3], 11, "%d", rand_num);
args[4]= NULL;
execv(args[0], args);
perror("execv failed:");
free(args[1]);
free(args[2]);
free(args[3]);
exit(EXIT_FAILURE);
}
,type
和name
获取相同的值。您可能希望每次要运行程序时更改随机数,并使用srand()和srandom()。