2017-12-27 212 views
1

我需要创建一个char *数组[],然后我必须传递给execv。随机char * args []传递给execv

  • 第一元件将是路径 “./exec_test”
  • 作为第二个参数:A/B
  • 之间随机选择的第三个参数:选择一个随机字母A - Z
  • 对于第四个参数:挑[2,2 + A_CONST]
  • 然后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

将'int'分配给'char *'..不是一个好方法。那么你是否认为这些地址是可以访问的? '0'到'RAND_MAX'? – coderredoc

+0

提高编译器的警告级别并严肃处理它的警告。 – alk

+1

“*实际上不知道它是什么*”那么学习C呢? – alk

回答

1

i get Error #014: Bad address.

的错误信息是非常明确的,你的程序试图使用无效的地址。

errno 14代表EFAULT。您访问的地址空间之外

execve

EFAULT

名点。

你的程序是抛出这个错误,因为这些语句:

args[1]= name; 
args[2]= type; 
args[3]= rand_num; 

这里argschar (*)[]型,这是char指针数组。 因此,您正在为char指针指定整数类型值,编译器必须为此给出警告

execv()访问的参数传递给它,它给Bad address错误,因为它正在考虑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); 
} 

附加:

当您运行您的程序,您必须为typenamerand_num会得到相同的价值观。您可能需要在每次运行程序时更改随机数,并使用srand()srandom()

+0

'sizeof(char)'根据定义等于1。 – alk