返回设置为函数参数的子字符串的本地指针是否安全?

时间:2015-01-10 23:56:37

标签: c function pointers return

我搜索了一段时间,却找不到类似的问题。 (很难提出这个问题的标题是有意义的)

在编写从路径获取文件名的函数时,我意识到也许我可以通过在传递的路径参数中返回指针而不必为目标缓冲区分配内存来编写它。

我的问题是,在传递的路径参数中返回指针是否安全?我知道返回指向本地的指针是未定义的行为,但是这种情况呢?或者有不同的首选方法(不必分配目标字符串)?

char *getFileFromPath(char *path, char slash)
{
    char *file = path;
    size_t len = strnlen(path, MAX_PATH);
    if (len == MAX_PATH)
        return NULL;

    size_t i = 0;
    for (i = len - 1; i >= 0; i--)
        if (path[i] == slash)
            break;

    if (i + 1 < len - 1)
        file = (path + i + 1);

    return file;
}

char *path = "some/path/to/file.txt";
char *file = getFileFromPath(path, '/');

2 个答案:

答案 0 :(得分:4)

严格来说,返回任何指针都是安全的。不安全的事情是,如果调用者尝试取消引用指针但指向的对象已经被释放。

在您的示例中,只要需要返回值,期望函数的调用者将其传递给函数的参数具有方便性是合理的。如果要先删除参数,调用者总是可以创建自己的相关子字符串副本。

所以是的,只要您清楚地记录它,将指针返回到作为参数传递的缓冲区是安全的。这也很重要,因为您的用户必须记住free函数返回的指针。

这样做并不罕见。例如,标准库的memchr函数就是这样做的,很难想象如何编写它不会这样做。

答案 1 :(得分:2)

您没有返回局部变量,您返回的指针指向作为path指针传递的原始数据,它类似于在不使用函数的情况下递增指针,因此它是安全的。

我建议标记参数const,以及类似

的返回值
const char *getFileFromPath(const char *path, char slash)
{
    const char *file = path;
    size_t len = strnlen(path, MAX_PATH);
    size_t i;

    if (len == MAX_PATH)
        return NULL;

    for (i = len ; (i > 0) && (path[--i] != slash) ; );

    if (i + 1 < len - 1)
        file = (path + i + 1);

    return file;
}

另请注意,size_tunsigned,因此i >= 0始终为真。