2017-12-27 211 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