【发布时间】:2021-05-13 11:33:46
【问题描述】:
假设我有一个函数可以返回一个字符的指针,或者更具体地说是一个字符串:
char* fun_that_returns_string () {
char* teststr = "Hello World";
return teststr;
}
现在我调用该函数并将其返回值分配给其他地方的char*:
char* s = fun_that_returns_string();
然后我可以打印返回的字符串并得到“正确”的结果:
printf("%s\n", s);
输出:
> Hello World
本地值teststr或者它的地址不应该在函数外无效,因为它返回后被清除了吗?它是未定义的行为吗,我很幸运在打印之前没有被覆盖?如果是这样,处理返回字符串的正确方法是什么?
另一个例子:当我使用预定义的函数时,例如ctime(3) 来自 time.h,它返回一个 char*,我直接在另一个函数的参数中调用该函数
time_t t;
t = time(&t);
foo(ctime(&t));
这个函数将接收ctime()的返回值,它是一个指向时间字符串第一个字符的指针,作为一个副本。所以和上面的一样吗?我的理解是,ctime() 内部发生的任何事情都不应再被取消引用,除非它在堆上被 malloc'ed(但在这种情况下我必须自己释放它)?
我的教授在一些示例代码中使用了这个 ctime()-direct-argument-thing,但我无法理解它。
【问题讨论】:
-
对于
ctime,cppreference 说这个函数返回一个指向静态数据的指针,不是线程安全的,这意味着返回的缓冲区在@ 中声明为static987654336@函数(或者是全局的)。
标签: c