0

重複の可能性:
C ++で配列を使用するにはどうすればよいですか?

私は次のCコードを持っています:

int main () {
    char *pathvc[MAX_PATHS];
    parsePath(pathvc);

    struct command_t command;

    command.name = lookup(command.argv, pathvc); //command.argv is: char *argv[MAX_ARGS];
}

char* lookupPath(char **argv, char **dir) {
    //Some implementation
}

これは、メイン関数で取得しているデバッグ情報です。

名前:pathvc詳細:{0x804c208 "/ usr / lib / lightdm / lightdm"、0x804c221 "/ usr / local / sbin"、​​0x804c231 "/ usr / local / bin"、​​0x804c240 "/ usr / sbin"、​​0x804c24a "/ usr / bin "、0x804c253" / sbin "、0x804c259" / bin "、0x804c25e" / usr / games "、0x0}デフォルト:0xbffff0a8 10進数:3221221544 16進数:0xbffff0a8バイナリ:10111111111111111111000010101000 8進数:027777770250

名前:pathvc [0]詳細:0x804c208 "/ usr / lib / lightdm / lightdm"

名前:pathvc [1]詳細:0x804c221 "/ usr / local / sbin"

名前:pathvc [2]詳細:0x804c231 "/ usr / local / bin"

名前:pathvc [3]詳細:0x804c240 "/ usr / sbin"

名前:pathvc [4]詳細:0x804c24a "/ usr / bin"

名前:pathvc [5]詳細:0x804c253 "/ sbin"

名前:pathvc [6]詳細:0x804c259 "/ bin"

名前:pathvc [7]詳細:0x804c25e "/ usr / games"

ただし、ルックアップ関数でpathvcを渡すと、次のようになります。

名前:dir詳細:0xbffff0a8デフォルト:0xbffff0a8 10進数:3221221544 16進数:0xbffff0a8バイナリ:10111111111111111111000010101000 8進数:027777770250

名前:* dir詳細:0x804c208 "/ usr / lib / lightdm / lightdm"

名前:** dir詳細:47'/'

ダブルポインターとして受け入れるルックアップ関数にポインターの配列を渡しているのに、パスの完全なリストではなく、最初のパスのみを指しているのはなぜですか。

私はCのポインターに慣れていないので、非常にばかげた質問をしている/質問している場合はご容赦ください。

4

2 に答える 2

2

デバッガーが何を知っているかだけの問題です。呼び出し元では、デバッガーはMAX_PATHSポインターがあることを確認できます。呼び出された関数では、それはわからないので、表示するエントリの数がわかりません。手動で他の人に依頼すると、他の人に表示されます。

こんな感じです:

void someFunc(int *j)
{
   // does j point to a single integer? An array? Who knows?
}

void foo(void)
{
   int p = 3;
   int* j = &p;
   // here we know j points to one integer
   someFunc(j);
}

void foo2(void)
{
   int* j[4];
   // here we know j is an array of four pointers
   someFunc(j);
}
于 2012-10-08T14:27:21.030 に答える
1

*dirと同じですがpathvc[0]、これは配列の最初の要素にすぎません。そうで**dirはありません。またはの代わりに使用してください。pathvc[1]pathvc[0][0]*(dir + 1)dir[1]

于 2012-10-08T14:28:05.830 に答える