2016-11-22 2 views
0

У меня есть серьезная проблема с exec.Iv пробовал обе опции со списком (execl) и массивом (execv), но проблема остается. Я дам функцию, в которой я пытаюсь сделать вызов.Ошибка Exec из-за плохого адреса

#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] содержит строку с именем исполняемого файла, скажем, "тест" .Я скомпилирован -> г ++ test.cpp -o тест -> так что я получил это исполняемый файл. Другие позиции aparams содержат некоторые аргументы для тестовой программы.

Итак, тест никогда не запускается (когда я запускаю его из командной строки, все в порядке), а perror показывает сообщение «Проблема в exec: Bad Address».

Я также попытался использовать все аргументы (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);  

Вы пытаетесь отправить wparams [3], который не существует! Это 4-й элемент массива wparam, и вы явно определили его как массив [3] при инициализации вашей переменной mcount.

Смежные вопросы