2012-12-19 39 views
5

Mã này dường như làm việc như mong đợi, populates một mảng các số sử dụng một con trỏ đơnstrtol tái sử dụng 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; 
} 

Câu hỏi của tôi là:

Nó có giá trị sử dụng p như param1 (nguồn) và & p là tham số 2 (địa chỉ của ký tự không hợp lệ đầu tiên) trong strtol?

Trả lời

1

Có, điều này là hợp lệ, vì bạn đang giữ con trỏ đến đầu chuỗi (con trỏ s). Hãy xem xét rằng bạn có tình huống này:

#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 sẽ di chuyển con trỏ đến một nơi nào đó trong chuỗi. Nếu bạn gọi free(p), bạn sẽ bị rò rỉ bộ nhớ (nếu không bị lỗi). Nhưng, vì bạn đang giữ con trỏ, bạn sẽ luôn có thể giải phóng bộ nhớ bị chiếm đóng.

6

Có, nó an toàn. Đối số đầu tiên được chuyển bởi giá trị, do đó, strtol có bản sao cục bộ không bị ảnh hưởng bởi các thay đổi được viết cho thông số thứ hai.

+0

Cảm ơn bạn Klas, nhưng những gì về các từ khóa hạn chế? cho toàn bộ thời gian của con trỏ, chỉ có nó hoặc giá trị trực tiếp bắt nguồn từ nó (như con trỏ +1) sẽ được sử dụng để truy cập đối tượng mà nó trỏ, đó có vẻ là một vấn đề –

+1

Nó sẽ là một vấn đề nếu ' strtol' sẽ truy cập '** endptr', nhưng nó không (vì những lý do tôi đã đề cập trong bình luận của tôi cho câu trả lời của Kirilenko). –

Các vấn đề liên quan