6

此代码似乎按预期工作,使用单个指针填充数字数组

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

我的问题是:

在 strtol 中使用 p 作为 param1(源)和 &p 作为 param 2(第一个无效字符的地址)是否有效?

4

3 回答 3

6

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

于 2012-12-19T12:16:27.570 回答
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),你会有内存泄漏(如果它没有失败)。但是,由于您保留 s 指针,因此您将始终能够释放占用的内存。

于 2012-12-19T12:06:08.647 回答
1

是的,它是安全的。

请参阅http://en.cppreference.com/w/cpp/string/byte/strtol以获取完整的使用参考。示例的第 11 行说明了对第一个和第二个参数使用相同变量的调用。

于 2012-12-19T12:10:37.183 回答