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]
(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
和rand_num
會得到相同的價值觀。您可能需要在每次運行程序時更改隨機數,並使用srand()和srandom()。
將'int'分配給'char *'..不是一個好方法。那麼你是否認爲這些地址是可以訪問的? '0'到'RAND_MAX'? – coderredoc
提高編譯器的警告級別並嚴肅處理它的警告。 – alk
「*實際上不知道它是什麼*」那麼學習C呢? – alk