2012-12-19 13 views
5

Dieser Code funktioniert wie erwartet scheint, füllt eine Reihe von Zahlen einen einzelnen Zeigerstrtol Wiederverwendung 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; 
} 

Meine Frage ist, mit:

Es gilt p als param1 (Quelle) zu verwenden und & p als Parameter 2 (Adresse des ersten ungültigen Zeichens) in strtol?

Antwort

1

Ja, das ist gültig, da Sie den Zeiger auf den Anfang der Zeichenfolge (Zeiger s) halten. Bedenken Sie, dass Sie diese Situation haben:

#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 wird p Zeiger auf irgendwo in Zeichenfolge bewegen. Wenn Sie free(p) aufrufen, haben Sie Speicherverlust (wenn es nicht fehlschlägt). Da Sie jedoch den Zeiger halten, können Sie den belegten Speicher immer freigeben.

6

Ja, es ist sicher. Das erste Argument wird als Wert übergeben, daher hat strtol eine lokale Kopie, die nicht von Änderungen betroffen ist, die in den zweiten Parameter geschrieben wurden.

+0

Vielen Dank Klas, aber was ist mit den einschränkenden Keywords? für die Lebensdauer des Zeigers, nur es oder ein direkt daraus abgeleiteter Wert (z. B. Zeiger + 1) wird verwendet, um auf das Objekt zuzugreifen, auf das er zeigt, das scheint ein Problem zu sein –

+1

Es wäre ein Problem, wenn strtol' würde auf "** endptr" zugreifen, aber das tut es nicht (aus den Gründen, die ich in meinem Kommentar zu Kirilenkos Antwort erwähnt habe). –