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 保持为空。我究竟做错了什么?

4

6 回答 6

6

没有变量叫做str1and str2,所以我假设你的意思是ptr1and 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 都没有更新。

从它的外观来看,您正在尝试在更新 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 回答
2

ptr1您永远不会为and赋值ptr2。使用,您只需将(NULL)tmp = ptr1的当前值复制到. 但是,之后的更改不会影响 的值。这就是它使用指针的方式。ptr1tmptmpptr1

试试这个:

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

或者重新声明并tmp用作指向指针的指针,正如@Marcelo Cantos 在他的回答中所展示的那样。

于 2010-05-07T13:12:58.373 回答
2

ptr1您没有为and赋值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 回答
1

您声明 ptr1 和 ptr2 并将它们初始化为 null,但您随后不设置它们的值。

于 2010-05-07T13:14:56.950 回答
1

您将 ptr1 和 ptr2 初始化为 NULL,并且永远不要更改它们。所以他们什么都没有。

于 2010-05-07T13:15:18.800 回答