2016-11-22 12 views
0

execに重大な問題があります。リスト(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]の実行可能ファイルの名前の文字列が含まれている、のは、 "テスト" .Iコンパイルしましょう - > G ++ます。test.cpp -oテスト - >私はこれを得ました実行可能ファイル。 aparamsの他の位置には、テストプログラムの引数がいくつか含まれています。

したがって、テストは実行されません(コマンドラインから実行するとOKです)。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]として明示的に定義しました。

関連する問題