2012-12-19 9 views
5

Kod ten wydaje się działać zgodnie z oczekiwaniami, wypełnia tablicę liczb przy użyciu jednego wskaźnikastrtol ponowne 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; 
} 

Moje pytanie brzmi:

Jest ważne, aby użyć P jako Param1 (źródło) i & p jako parametr 2 (adres pierwszego nieprawidłowego znaku) w strtol?

Odpowiedz

1

Tak, jest to ważne, ponieważ trzymasz wskaźnik na początku łańcucha (wskaźnik s). Uważają, że masz taką sytuację:

#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 ruszy p wskaźnik gdzieś w ciąg. Jeśli zadzwonisz pod numer free(p), będziesz miał wyciek pamięci (jeśli się nie zawiedzie). Ale ponieważ zachowujesz wskaźnik, zawsze będziesz w stanie uwolnić zajętą ​​pamięć.

6

Tak, jest bezpiecznie. Pierwszy argument jest przekazywany przez wartość, więc strtol ma lokalną kopię, na którą nie wpływają zmiany zapisane do drugiego parametru.

+0

Dziękuję Klas, ale co z ograniczającymi słowami kluczowymi? na czas życia wskaźnika, tylko on lub wartość bezpośrednio z niego wyprowadzona (np. Wskaźnik + 1) zostanie wykorzystany do uzyskania dostępu do obiektu, do którego wskazuje, co wydaje się być problemem –

+1

Byłby to problem, gdyby strtol' miałby dostęp do '** endptr', ale tak się nie stało (z powodów wymienionych w moim komentarzu do odpowiedzi Kirilenki). –