2012-12-19 20 views
5
Bu kod beklendiği gibi iş gibi görünüyor

, tek işaretçi kullanarak sayılar dizisi doldururstrtol yeniden 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; 
} 

Sorum şu:

O Param1 (kaynak) olarak s kullanmak geçerlidir ve & p strtol'de param 2 (ilk geçersiz karakterin adresi) olarak mı?

cevap

1

Evet, bu, işaretçiyi dizenin başlangıcına (işaretçi s) tuttuğunuz için geçerlidir. Bu durumu olduğunu düşünün:

#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 dizede bir yere p işaretçisi hareket edecektir. Eğer free(p) numaralı telefonu arayacak olursanız, bellek sızıntısı olacak demektir (eğer başarısız olursa). Ancak, işaretçiyi tuttuğunuz için, her zaman işgal edilen hafızayı kaldırabileceksiniz.

6

Evet, bu güvenlidir. İlk argüman değere göre iletilir, bu nedenle strtol, ikinci parametreye yazılan değişikliklerden etkilenmeyen yerel bir kopyasına sahiptir.

+0

Teşekkür ederim Klas, ama kısıtlama anahtar kelimeleri ne olacak? işaretçisinin ömrü boyunca, sadece o veya doğrudan (örneğin, işaretçi + 1) türetilen bir nesneye erişmek için kullanılacak, bu sorun gibi görünüyor bir sorun gibi görünüyor –

+1

strtol' '** endptr''ye erişirdi, fakat (Kirilenko'nun cevabına yaptığım yorumda bahsettiğim nedenlerden dolayı). –

İlgili konular