1

このコードを考えてみましょう:

char *strs[] = { "string1", "string2", NULL };
char *ptr1 = NULL, *ptr2 = NULL, *tmp;
short iter = 0;

tmp = ptr1;
while (iter < 2)
{
   tmp = strdup(strs[iter]);
   tmp = ptr2;
   iter++;
}

printf("1: %s\n2: %s\n", ptr1, ptr2);

これで「string1\nstring2 \ n」を出力したいのですが、str1とstr2はnullのままです。私は何が間違っているのですか?

4

6 に答える 6

6

str1andと呼ばれる変数はないstr2ので、あなたがandを意味していると仮定しptr1ますptr2

これらの変数には何も割り当てないため、元の値から変更する理由はありません。私はこれがあなたが意図したものだと思います:

char *strs[] = { "string1", "string2", NULL };
char *ptr1 = NULL, *ptr2 = NULL, **tmp;
short iter = 0;

tmp = &ptr1;
while (iter < 2)
{
   *tmp = strdup(strs[iter]);
   tmp = &ptr2;
   iter++;
}

printf("1: %s\n2: %s\n", ptr1, ptr2);

ただし、これはかなり奇妙なコードです。あなたは実際に何を達成しようとしていますか?よりエレガントな解決策があるかもしれません。

于 2010-05-07T13:13:39.723 に答える
2

ptr1とに値を割り当てることはありませんptr2。を使用すると、 (NULLである)tmp = ptr1の現在の値をにコピーするだけです。ただし、後で変更しても、の値には影響しません。これは、ポインタでどのように機能するかです。ptr1tmptmpptr1

代わりにこれを試してください:

ptr1 = strdup(strs[0]);
ptr2 = strdup(strs[1]);

またはtmp、@ Marcelo Cantosが回答で示しているように、再宣言してポインタへのポインタとして使用します。

于 2010-05-07T13:12:58.373 に答える
2

ptr1とに値を割り当てていませんptr2。あなたは次のようなことをすることができます:

while (iter < 2) {
    tmp = strdup(strs[iter]);
    if(iter == 0)
        ptr1 = tmp;
    else if(iter == 1)
        ptr2 = tmp;
    iter++;
}

またはさらに簡単:

ptr1 = strdup(strs[0]);
ptr2 = strdup(strs[1]);
于 2010-05-07T13:15:57.623 に答える
2

そのままでは、ptr1もptr2も更新されません。

見た目からすると、tmpが更新されたときにptr1とptr2を更新しようとしています。これを行うには、tmpをダブルポインタにする必要があり、コードは次のようになります...

char *strs[] = { "string1", "string2", NULL };
char *ptr1 = NULL, *ptr2 = NULL, **tmp;
short iter = 0;

tmp = &ptr1;
while (iter < 2)
{
   *tmp = strdup(strs[iter]);
   tmp = &ptr2;
   iter++;
}

printf("1: %s\n2: %s\n", ptr1, ptr2);

お役に立てれば。

于 2010-05-07T13:17:22.517 に答える
1

ptr1とptr2を宣言し、それらをnullに初期化しますが、その後、それらの値を設定しません。

于 2010-05-07T13:14:56.950 に答える
1

ptr1とptr2をNULLに初期化し、変更しないでください。だから彼らは何も指さない。

于 2010-05-07T13:15:18.800 に答える