2012-12-19 17 views
5

此代碼似乎按預期方式工作,填充使用單個指針數的數組strtol將重用PARAM

#include <stdio.h> 
#include <ctype.h> 
#include <stdlib.h> 

int main(void) 
{ 
    int arr[4], count = 0, i; 
    char *p, s[32] = " \t 10, 15 \n ,20, 25 , "; 

    p = s; 
    do { 
     arr[count++] = (int)strtol(p, &p, 10); 
     while (isspace(*p) || *p == ',') p++; 
    } while (*p); 
    for (i = 0; i < count; i++) { 
     printf("%d\n", arr[i]); 
    } 
    return 0; 
} 

我的問題是:

它是有效的使用數p作爲參數1(源)和& p作爲參數2(第一個無效字符的地址)在strtol中?

回答

1

是的,這是有效的,因爲您將指針保留在字符串(指針s)的開頭。想想看,你有這樣的情況:

#include <stdio.h> 
#include <ctype.h> 
#include <stdlib.h> 
#include <string.h> 

int main(void) 
{ 
    int arr[4], count = 0, i; 
    char *p, *s; 
    s = (char*)malloc(sizeof(char) * 15); 
    strcpy(s, " \t 10, 15 \n ,20, 25 , "); 

    p = s; 
    do { 
     arr[count++] = (int)strtol(p, &p, 10); 
     while (isspace(*p) || *p == ',') p++; 
    } while (*p); 
    for (i = 0; i < count; i++) { 
     printf("%d\n", arr[i]); 
    } 
    free(s); 
    return 0; 
} 

strtol將P指向移動到某個字符串。如果你打電話給free(p),你會有內存泄漏(如果沒有失敗)。但是,既然你保持指針,你將永遠能夠釋放佔用的內存。

6

是的,它是安全的。第一個參數是按值傳遞的,所以strtol有一個本地副本,它不受寫入第二個參數的更改的影響。

+0

謝謝Klas,但限制關鍵字怎麼樣? 對於指針的生命週期,只有它或者直接從它得到的值(比如指針+ 1)纔會被用來訪問它指向的對象,這似乎是一個問題 –

+1

這將是一個問題,如果' strtol'可以訪問'** endptr',但它不會(因爲我在我對Kirilenko答案的評論中提到的原因)。 –