要传递给execv的随机字符*args[]

要传递给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(

我需要创建一个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(); 
    
        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:地址不正确。

我收到错误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
to
RAND_MAX
?提高编译器的警告级别并严肃对待它的警告。“无法真正理解它是什么”那么学习C呢?
sizeof(char)
根据定义等于1。