2010-05-07 2 views
1

Рассмотрим этот код:Что не так с этим кодом 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 \ п", однако str1 и str2 остается пустым. Что я делаю не так?

ответ

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

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

+0

Реальный код перебирает двоичный файл до тех пор, пока не найдет «patternA», а затем сохранит некоторые данные, которые появляются после «patternA» в структуре, во втором цикле он переключается на новый шаблон «patternB» и сохраняет некоторые данные, которые появляется после него в другом значении в этой структуре. – user318747

+0

@bstullkid: В таком случае проще написать две петли. –

2

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

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

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

Или переобъявить и использовать tmp как указатель на указатель, как показывает @Marcelo кантосё в своем ответе.

1

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

1

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

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

Как это ни 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); 

Надеется, что это помогает.