要传递给execv的随机字符*args[]
我需要创建一个char*数组[],然后将其传递给execv要传递给execv的随机字符*args[],c,pointers,random,exec,C,Pointers,Random,Exec,我需要创建一个char*数组[],然后将其传递给execv 第一个元素是路径“/exec\u test” 对于第二个参数:在A/B之间随机选择 对于第三个参数:选择一个随机字母a-Z 对于第四个参数:选择[2,2+A_CONST]之间的随机整数 然后无效 void perform_exec(){ char *type= 'A' + (random() % 2); char *name= 'A' + (random() % 64); int rand_num= rand(
- 第一个元素是路径“/exec\u test”
- 对于第二个参数:在A/B之间随机选择
- 对于第三个参数:选择一个随机字母a-Z
- 对于第四个参数:选择[2,2+A_CONST]之间的随机整数
- 然后无效
}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:地址不正确。
错误消息非常清楚,您的程序正试图使用无效地址
errno
14表示EFAULT
从
埃法特
文件名指向可访问的地址空间之外
由于以下语句,您的程序正在抛出此错误:
args[1]= name;
args[2]= type;
args[3]= rand_num;
这里的args
类型为char(*)[]
,它是char
指针的数组。
所以,您正在将整型值分配给char
指针,编译器必须为此发出警告
execv()
访问传递给它的参数,它给出了错误地址
错误,因为它将args[1]
(name
)、args[2]
(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);
}
其他:
运行程序时,必须为
类型
、名称
和随机数
获取相同的值。您可能希望在每次运行程序时更改随机数,并使用and.将int
分配给char*
。这不是一个好办法。是的,你认为这些地址可以访问吗0
toRAND_MAX
?提高编译器的警告级别并严肃对待它的警告。“无法真正理解它是什么”那么学习C呢?sizeof(char)
根据定义等于1。