C语言中字符串文字的“生命周期”

C语言中字符串文字的“生命周期”

以下函数返回的指针不会无法访问吗?

char *foo( int rc ) {
    switch (rc) 
    {
      case 1:           return("one");
      case 2:           return("two");
      default:           return("whatever");
    }}

所以C / C ++中局部变量的生命周期实际上只在函数内,对吧?这意味着,在char* foo(int)终止后,它返回的指针不再意味着什么?

我对本地var的生命周期有点困惑。谁能给我一个很好的澄清?


泛舟湖上清波郎朗
浏览 799回答 3
3回答

MMMHUHU

它是有效的,字符串文字有静态存储持续时间,所以指针不是悬空。对于C,这是第6.4.5节第6段规定的:在转换阶段7中,将值为零的字节或代码附加到由字符串文字或文字产生的每个多字节字符序列。然后使用多字节字符序列初始化静态存储持续时间和长度的数组,该数组足以包含序列。对于C ++的2.14.5节,第8-11段:8普通字符串文字和UTF-8字符串文字也称为窄字符串文字。窄字符串文字的类型为“n的数组const char”,其中n是下面定义的字符串的大小,并且具有静态存储持续时间(3.7)。9以u开头的字符串文字,例如u"asdf",是一个char16_t字符串文字。甲char16_t文字串具有类型为“n的阵列const char16_t,其中n是如下面所定义的字符串的大小”; 它具有静态存储持续时间,并使用给定的字符进行初始化。单个c-char可以char16_t以代理对的形式产生多个字符。10以U开头的字符串文字,例如U"asdf",是一个char32_t字符串文字。甲char32_t文字串具有类型为“n的阵列const char32_t,其中n是如下面所定义的字符串的大小”; 它具有静态存储持续时间,并使用给定的字符进行初始化。11以L开头的字符串文字,例如L"asdf",是一个宽字符串文字。宽字符串文字的类型为“数组n const wchar_t”,其中n是字符串的大小,如下所示; 它具有静态存储持续时间,并使用给定的字符进行初始化。

慕盖茨4494581

是的,这是有效的代码,下面的案例1。您至少可以通过以下方式安全地从函数返回C字符串:const char*到字符串文字。无法修改,不得被调用者释放。由于下面描述的释放问题,很少用于返回默认值。如果你真的需要在某处传递函数指针,那么可能有意义,所以你需要一个函数返回一个字符串..char*或const char*静态字符缓冲区。不得被来电者释放。可以修改(通过调用者,如果不是const,或通过返回它的函数),但返回此函数不能(容易)有多个缓冲区,所以不(轻松)线程安全,调用者可能需要复制返回再次调用函数之前的值。char*分配给的缓冲区malloc。可以修改,但通常必须由调用者显式释放,并具有堆分配开销。strdup属于这种类型。const char*或者char*作为参数传递给函数的缓冲区(返回的指针不需要指向参数缓冲区的第一个元素)。将缓冲区/内存管理的责任留给调用者。许多标准字符串函数都属于这种类型。一个问题是,将这些功能混合在一个功能中会变得复杂。调用者需要知道它应该如何处理返回的指针,它有效的时间,以及调用者是否应该释放它,并且没有(好的)方法在运行时确定它。因此,您不能拥有一个函数,它有时会返回一个指向调用者需要的堆分配缓冲区free的指针,有时还会指向一个指向字符串文字的默认值的指针,调用者不能这样做 free。
打开App,查看更多内容
随时随地看视频慕课网APP