这个c strdup代码有什么问题?

时间:2010-05-07 13:09:34

标签: c strdup

考虑以下代码:

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

6 个答案:

答案 0 :(得分:6)

没有名为str1str2的变量,因此我假设您的意思是ptr1ptr2

您永远不会为这些变量分配任何内容,因此没有理由让它们从原始值更改。我认为这就是你的意图:

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);
然而,这是一段相当奇怪的代码。你究竟想要实现什么目标?可能有一个更优雅的解决方案。

答案 1 :(得分:2)

您永远不会为ptr1ptr2分配值。使用tmp = ptr1,您只需将ptr1的当前值(即NULL)复制到tmp。但是,之后更改tmp不会影响ptr1的值。这就是它如何与指针一起使用。

请改为尝试:

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

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

答案 2 :(得分:2)

您没有为ptr1ptr2分配值。你可以这样做:

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]);

答案 3 :(得分: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);

希望这有帮助。

答案 4 :(得分:1)

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

答案 5 :(得分:1)

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