我搜索了一会儿,没有找到类似的问题。 (很难为这个问题想出一个有意义的标题)
在编写一个从路径获取文件名的函数时,我意识到也许我可以通过在传递的路径参数中返回一个指针来编写它而不必为目标缓冲区分配内存。
我的问题是,像这样在传递的路径参数中返回指针是否安全?我知道返回指向本地的指针是未定义的行为,但是这种情况呢?或者是否有不同的首选方法来执行此操作(无需分配目标字符串)?
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/