考虑以下代码:
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保持为空。我做错了什么?
答案 0 :(得分:6)
没有名为str1
和str2
的变量,因此我假设您的意思是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);
然而,这是一段相当奇怪的代码。你究竟想要实现什么目标?可能有一个更优雅的解决方案。
答案 1 :(得分:2)
您永远不会为ptr1
和ptr2
分配值。使用tmp = ptr1
,您只需将ptr1
的当前值(即NULL)复制到tmp
。但是,之后更改tmp
不会影响ptr1
的值。这就是它如何与指针一起使用。
请改为尝试:
ptr1 = strdup(strs[0]);
ptr2 = strdup(strs[1]);
或者重新声明并使用tmp
作为指针的指针,正如@Marcelo Cantos在他的回答中所展示的那样。
答案 2 :(得分: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]);
答案 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,并且永远不会更改它们。所以他们什么都不指望。