get_arguments
からNULL
への文字列の配列を取得する方法、またはexecv
呼び出しで機能しない場合は、文字列の配列を取得する方法を調べようとしています。null文字列の配列を終了します
char ** get_arguments(const char * string) {
char * copy = strdup(string);
char * remove_newline = "";
for(;;) {
remove_newline = strpbrk(copy, "\n\t");
if (remove_newline) {
strcpy(remove_newline, "");
}
else {
break;
}
}
char (* temp)[16] = (char *) malloc(256 * sizeof(char));
char * token = strtok(copy, " ");
strcpy(temp[0], token);
int i = 1;
while (token && (token = strtok(NULL, " "))) {
strcpy(temp[i], token);
i++;
}
char * new_null;
//new_null = NULL;
//strcpy(temp[i], new_null);
if(!temp[i]) printf("yup\n");
int c = 0;
for (; c <= i; c++) {
printf("%s ", temp[c]);
}
return temp;
}
find ./ -name *.h
と同様に、スペースで区切られた文字列を読み込もうとしています。 execv
に入力しようとしています。無関係なコードの
char (* arguments)[16] = (char **) malloc(256 * sizeof(char));
//...numerousライン
pid = fork();
if (pid == 0) {
arguments = get_arguments(input_string);
char * para[] = {"find", "./","-name", "*.h", NULL};
execv("/usr/bin/find", (char * const *) arguments);
//printf("%s\n", arguments[0]);
printf("\nexec failed: %s\n", strerror(errno)); //ls -l -R
exit(-1);
}
私はpara
ためexecv
コールでarguments
を交換するとき、それは意図したとおりに動作しますが、arguments
戻りexec failed: Bad address
を呼び出そう。 NULL
をpara
から削除すると、同じ問題が発生します。私はstrcpy(temp, (char *) NULL)
を試しました。あなたが見たバージョンはget_arguments
であり、他の多くのことが思い出せません。からstrcpy
へのコンパイルに失敗しました。
引数とテンポラリの宣言をchar ** arguments = (char *) malloc(256 * sizeof(char));
に変更する `` char ** temp =(char *)malloc(256 * sizeof(char)); clears up
警告:互換性のないポインタ型からの初期化but causes segfault on all calls to
get_arguments`。
私が最も混乱しています、私は宣言した配列空間の未使用領域がnullにデフォルト設定されていることを言って読んでほとんどの場所が、それが失敗した理由は、 '場合printf( "yup \ n"); '私が試みたすべての条件の下でテストします。 – Kebtiz
'malloc()'の前にある '(char *)'キャストを削除することができます。 –
ありがとうございます、それは '警告:互換性のないポインタ型からの初期化'をクリアしました。奇妙なのは、私が繰り返し使用したのが見た大会です。その明示的な型が必要な状況はありますか? – Kebtiz