2012-12-19 16 views
5

Questo codice sembra funzionare come previsto, popola una matrice di numeri utilizzando un unico puntatorestrtol riutilizzo 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; 
} 

La mia domanda è:

E 'valido da usare p come param1 (sorgente) e & p come parametro 2 (indirizzo del primo carattere non valido) in strtol?

risposta

1

Sì, questo è valido, poiché si mantiene il puntatore all'inizio della stringa (puntatore s). Si consideri che avete questa situazione:

#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 si sposterà puntatore p da qualche parte nella stringa. Se chiami free(p), avrai una perdita di memoria (se non fallisce). Ma, dato che stai tenendo il puntatore del mouse, sarai sempre in grado di liberare la memoria occupata.

6

Sì, è sicuro. Il primo argomento è passato per valore, quindi strtol ha una copia locale che non è influenzata dalle modifiche scritte nel secondo parametro.

+0

Grazie Klas, ma per quanto riguarda le parole chiave restrittive? per la durata del puntatore, solo esso o un valore direttamente derivato da esso (come puntatore + 1) verrà utilizzato per accedere all'oggetto a cui punta, che sembra essere un problema –

+1

Sarebbe un problema se ' strtol' accederà a '** endptr', ma non lo fa (per i motivi che ho menzionato nel mio commento alla risposta di Kirilenko). –