2016-11-22 59 views
0

我有一個exec的嚴重問題。我已經嘗試了列表(execl)和數組(execv)兩個選項,但問題仍然存在。我會給我的功能,我試圖使電話。執行失敗,由於錯誤地址

#include <unistd.h> 
#include <sys/types.h> 
void MyFunc(string aparams[],char* infile,char* outfile,int k,int points){ 

int mcount=3; 
char* offset= new char[5]; 
sprintf(offset,"%d",k); 
char* pntr=new char[5]; 
sprintf(pntr,"%d",points); 
char* *wparams=new char*[mcount]; 
for (int i = 0; i < mcount; i++) { 
    wparams[i] = new char[aparams[i].length() + 1]; 
    strcpy(wparams[i], aparams[i].c_str()); 
} 
char *cwd; 
cwd=(char*)malloc(255); 
getcwd(cwd,255); 
strcat(cwd,"/"); 
strcat(cwd,wparams[0]); 
cout << cwd << endl; 
execl(cwd,wparams[0],"-i",infile,"-o",outfile,"-f",offset,"-n",pntr,"-a",wparams[1],wparams[2],wparams[3],(char*) NULL);  

cout << "exec failed" << endl; 
perror("The problem in exec is:"); 
exit(3); 

}

aparams [0]包含了可執行文件的名稱的字符串,讓我們說 「測試」。我編譯 - > G ++ TEST.CPP -o測試 - >所以我得到這個可執行文件。 aparams的其他位置包含測試程序的一些參數。

所以,測試永遠不會運行(當我從命令行運行它沒關係),perror顯示消息「exec中的問題是:壞地址。」

我也試圖強制轉換所有參數(const char *),但沒有任何改變。 這是一個參數問題嗎?或者這是可執行文件的問題?

+0

'cout << cwd << endl;'print? – immibis

+0

它打印了我有文件測試的預期路徑。 –

回答

2

mcount是3,所以wparams指向具有三個元素的數組 - wparams[0]wparams[1]wparams[2]

然後你訪問wparams[3]這是無效的,幷包含垃圾。

不要嘗試訪問不存在的數組元素。

+0

哦..好!!!你無法想象有多少小時我一直在考慮複雜的事情,並認爲我真的檢查過代碼。很多謝謝! –

1

您的問題是在這條線:

execl(cwd, 
    wparams[0], 
    "-i", infile, "-o", outfile, "-f", offset, "-n", pntr, 
    "-a", wparams[1], wparams[2], wparams[3], (char*) NULL);  

您正在嘗試發送[3],不存在wparams!這是wparam數組的第4個元素,並且在初始化變量mcount時,您明確將其定義爲數組[3]。

相關問題