c - 返回设置为函数参数子字符串的局部指针是否安全?

标签 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, '/');

最佳答案

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

在您的示例中,可以合理地期望函数的调用者只要需要返回值,就会将传递给函数的参数放在手边。如果要更早删除参数,调用者始终可以制作自己的相关子字符串副本。

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

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

关于c - 返回设置为函数参数子字符串的局部指针是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27882469/

相关文章:

c++ - 让 credis 在 C++ 解决方案中工作

CUDA 没有按预期工作?

Javascript 参数 : Having many parameters with many defaults

c - 了解 C 语言中的复杂指针示例代码

void* 指针的 C++ 替代品(不是模板)

pointers - 派生类型中的关联指针? gFortran 与英特尔

我可以通过更好的数组操作来优化此代码吗?

c - 在 C 中返回一个数组

r - 将运算符分配给 R 变量

c++ - 当从父类(super class)的指针调用时,基类函数不会覆盖父类(super class)函数