0

これは、私が C プログラミングに慣れていないためかもしれませんが、講師を正しく思い出せば

PART 1) execvp(2)は 2 つの引数 (obv) を取ります。最初の引数はコマンドで、2 番目の引数は次のような文字列の配列です。

char *args[] = {"ls", "-l", "-a", NULL};

char *args[]これを、char を含む配列 (C の null で終了する文字列) ではなく、文字列の配列にする方法について説明してもらえますか?

パート2)

この配列文字列に文字列ごとに追加できるようにするにはどうすればよいですか? できるかな

int i;
char *args[255];

for(i = 0; i < strlen(lol); i++)
{
    args[i] = //new string being passed in at runtime
}

そして、それはそのように機能しますか?stdin からの入力を分割していて、引数を に入れたいとしargs[i]ます。

4

2 に答える 2

1

パート1)

char *args[] = {"ls", "-l", "-a", NULL};

上記のコードは、char ポインターの配列を作成していることを意味します。

各 char ポインターには、コンパイル時に (中かっこ){} 内にある (二重引用符)"" 内の文字列の定義に基づいて、固定サイズのメモリが割り当てられます。この場合、char ポインタが指す文字列のサイズを変更することはできません。ポインタが指す文字列の内容は引き続き変更できます。

に似ている char [][4]={"ls", "-l", "-a", NULL};

パート 2) char ポインターに malloc または calloc を使用して明示的にメモリを割り当てない限り、これを行うことはできません。次に、strncpy を使用して、文字列を配列内のその char ポインターにコピーします。

Part-1ではコンパイル時に固定サイズのメモリを確保していましたが、Part-2ではメモリを全く確保していないのでそのようにはできません。

于 2012-08-10T07:29:00.033 に答える
1

この宣言char *args[]は、「args は char へのポインターの配列である」と解読できます。これは、配列の各エントリが、1 つ以上charの がある場所を指していることを意味します。

静的初期化宣言を行うとargs、コンパイラは、それぞれが char 型へのポインターを持つ正確な数の初期化子用のスペースを予約します (この場合、配列には 4 つのポインターがあります)。

初期化文字列ごとに、コンパイラはスペースを確保し (通常は読み取り専用データ セグメント内)、そこに個々の文字を配置し、null を最後の文字にします。配列argsには、この場所へのポインタが含まれています。したがって、そこには間接的なレベルがあります。

args[0] ---- points at memory location where 3 chars are -----> 'l', 's', '\0'

2)に関してはargs、ポインタの配列(2D配列ではない)としてそれを行うことができます。ただし、null で終わる文字シーケンスがある正しいメモリ位置を割り当てる必要があります。argsただし、配列が適切なサイズであることを確認する必要があります。配列宣言中にサイズが指定されていない場合、コンパイラは提供された初期化子にのみ十分なスペースを割り当て、後でサイズを変更することはできません。

于 2012-08-10T07:29:31.047 に答える