Что не так с этим кодом strdup? - PullRequest
1 голос
/ 07 мая 2010

Рассмотрим этот код:

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 ]

6 голосов
/ 07 мая 2010

Нет переменных с именами 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);

Однако это довольно странный кусок кода. Чего вы на самом деле пытаетесь достичь? Там может быть более элегантное решение.

2 голосов
/ 07 мая 2010

Как таковые, ни ptr1, ни ptr2 не обновляются.

Судя по всему, вы пытаетесь обновить ptr1 и ptr2 при обновлении tmp.Для этого 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);

Надеюсь, это поможет.

2 голосов
/ 07 мая 2010

Вы не присваиваете значения 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]);
2 голосов
/ 07 мая 2010

Вы никогда не назначаете значение ptr1 и ptr2. С tmp = ptr1 вы просто копируете текущее значение ptr1 (равное NULL) в tmp. Однако изменение tmp впоследствии не влияет на значение ptr1. Вот как это работает с указателями.

Попробуйте вместо этого:

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

Или переопределить и использовать tmp в качестве указателя на указатель, как демонстрирует @Marcelo Cantos в своем ответе.

1 голос
/ 07 мая 2010

Вы инициализируете ptr1 и ptr2 в NULL и никогда не меняете их. Поэтому они ни на что не указывают.

1 голос
/ 07 мая 2010

Вы объявляете ptr1 и ptr2 и инициализируете их нулем, но впоследствии не устанавливаете их значения.

...