2010-05-07 48 views
1

考慮以下代碼:這個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); 

我想這是輸出 「字符串1 \ nstring2 \ n」 但是str1和STR2保持空。我究竟做錯了什麼?

回答

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

然而,這是一個相當離奇的代碼段。你究竟在努力實現什麼?可能有更優雅的解決方案。

+0

真正代碼通過一個二進制文件中循環,直到它找到「patternA」然後存儲在一個結構「patternA」之後到來時,在第二循環的某些數據切換到一個新的模式「patternB」並存儲一些數據在該結構中的另一個值之後。 – user318747 2010-05-07 15:00:21

+0

@bstullkid:在這種情況下,編寫兩個循環可能會更簡單。 – 2010-05-07 22:39:22

2

你從來就不是一個值分配給ptr1ptr2。使用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

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

正因爲如此,既不PTR1也不PTR2被更新。

從外觀上來看,你想有ptr1的TMP時更新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); 

希望這有助於。