strtol réutilisant param

Ce code semble fonctionner comme prévu. Remplit un tableau de nombres en utilisant un seul pointeur.

#include  #include  #include  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; } 

Ma question est:

Il est valide d’utiliser p comme paramètre 1 (source) et & p comme paramètre 2 (adresse du premier caractère non valide) dans strtol?

    Oui c’est sûr.

    Veuillez vous reporter à http://fr.cppreference.com/w/cpp/ssortingng/byte/strtol pour obtenir une référence d’utilisation complète. La ligne 11 de l’exemple illustre un appel utilisant la même variable pour les premier et deuxième parameters.

    Oui, c’est sécuritaire. Le premier argument est passé par valeur, donc strtol a une copie locale qui n’est pas affectée par les modifications écrites dans le second paramètre.

    Oui, cela est valide, car vous gardez le pointeur au début de la chaîne (pointeur). Considérez que vous avez cette situation:

     #include  #include  #include  #include  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 déplacera le pointeur p quelque part dans la chaîne. Si vous appelez free(p) vous aurez une fuite de mémoire (si elle n’échoue pas). Mais puisque vous gardez le pointeur, vous pourrez toujours libérer la mémoire occupée.