2012-12-19 18 views
5

此代码似乎按预期方式工作,填充使用单个指针数的数组strtol将重用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; 
} 

我的问题是:

它是有效的使用数p作为参数1(源)和& p作为参数2(第一个无效字符的地址)在strtol中?

回答

1

是的,这是有效的,因为您将指针保留在字符串(指针s)的开头。想想看,你有这样的情况:

#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将P指向移动到某个字符串。如果你打电话给free(p),你会有内存泄漏(如果没有失败)。但是,既然你保持指针,你将永远能够释放占用的内存。

6

是的,它是安全的。第一个参数是按值传递的,所以strtol有一个本地副本,它不受写入第二个参数的更改的影响。

+0

谢谢Klas,但限制关键字怎么样? 对于指针的生命周期,只有它或者直接从它得到的值(比如指针+ 1)才会被用来访问它指向的对象,这似乎是一个问题 –

+1

这将是一个问题,如果' strtol'可以访问'** endptr',但它不会(因为我在我对Kirilenko答案的评论中提到的原因)。 –