Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么我可以从函数中取消引用char指针/字符串返回值?_C - Fatal编程技术网

为什么我可以从函数中取消引用char指针/字符串返回值?

为什么我可以从函数中取消引用char指针/字符串返回值?,c,C,假设我有一个函数,它返回一个指向字符的指针,或者更具体地说是一个字符串: 返回字符串(){ char*teststr=“你好世界”; 返回teststr; } 现在我调用该函数并将其返回值赋给另一个地方的char*: char*s=fun\u返回字符串(); 然后,我可以打印返回的字符串并得到“正确”的结果: printf(“%s\n”,s); 输出: >你好,世界 本地值teststr或其地址不应该在函数外部无效,因为它在返回后会被清除吗?这是一种未定义的行为吗?我很幸运,在打印之前没

假设我有一个函数,它返回一个指向字符的指针,或者更具体地说是一个字符串:

返回字符串(){ char*teststr=“你好世界”; 返回teststr; } 现在我调用该函数并将其返回值赋给另一个地方的
char*

char*s=fun\u返回字符串();
然后,我可以打印返回的字符串并得到“正确”的结果:

printf(“%s\n”,s);
输出:

>你好,世界
本地值
teststr
或其地址不应该在函数外部无效,因为它在返回后会被清除吗?这是一种未定义的行为吗?我很幸运,在打印之前没有被覆盖?如果是这样,处理返回字符串的正确方法是什么

另一个例子:当我使用预定义的函数,例如
ctime(3)
from
time.h
,它返回一个
char*
,我直接在另一个函数的参数中调用该函数

time\t;
t=时间(&t);
foo(ctime&t);;
此函数将接收返回值
ctime()
,它是指向时间字符串第一个字符的指针,作为副本。这和上面的一样?我的理解是,在
ctime()
中发生的任何事情都不应该再被取消引用,除非它在堆上被malloc'ed(但在这种情况下,我必须自己释放它)


我的教授在一些示例代码中使用了这个ctime()-直接参数的东西,我简直无法理解它。

您的第一个示例是完全合法的,并按预期工作


原因是您正在获取静态字符串的地址<代码>“Hello World”定义保存在程序二进制文件中的字符数组。然后,它会在运行时将该数组的地址返回给您。因为字符串是程序的一部分,所以它总是可用的,并且它的指针永远不会失效。因此,定义字符串的函数是否返回与指针的有效性无关。

您认为函数返回局部变量的地址通常是错误的,因为一旦函数结束,该变量将“不再存在”。但是,在代码中,返回的是字符串文本的地址。在这种情况下,可以保证数据具有静态存储:

6.4.5字符串文字

语义

6…然后使用多字节字符序列初始化静态存储持续时间和长度刚好足以包含该序列的数组

关于
ctime
函数返回的字符串的第二点,静态存储再次起到了帮助作用:

返回值
  • 指向以null结尾的静态字符串的指针,该字符串包含日期和时间的文本表示形式。字符串可以在asctime和ctime之间共享,并且可以在每次调用这些函数时被覆盖


  • 有关C中使用的各种存储类(包括静态存储)的描述,请参见。

    这是否回答了您的问题?至于
    ctime
    ,cppreference说这个函数返回一个指向静态数据的指针,并且不是线程安全的,这意味着返回的缓冲区在
    ctime
    函数中声明为
    static
    (或者是全局的)。