C变量的范围

时间:2012-08-27 09:03:59

标签: c scope heap local

  

可能重复:
  Is returning a string literal address from a function safe and portable?
  “life-time” of string literal in C

您好我有点困惑

char *func()
 {

    return "Hello";
 }

这里“Hello”是字符序列/数组。它是一个局部变量,一旦函数返回它就必须消失。那我们怎么能得到正确的价值呢?

4 个答案:

答案 0 :(得分:10)

"Hello"是一个字符串文字,将在程序的生命周期内存在。引用C99标准的相关部分:

  • 6.4.5字符串文字
  

...然后使用多字节字符序列初始化静态存储持续时间的数组,并且长度足以包含序列...

  • 6.2.4对象的存储持续时间
  

一个对象,其标识符使用外部或内部链接声明,或者使用   存储类说明符static具有静态存储持续时间。它的一生就是整个   程序执行程序及其存储的值仅在程序之前初始化一次   启动。

函数的返回值应为const char*,因为尝试修改字符串文字是未定义的行为。

答案 1 :(得分:1)

它是常量并且在内存中具有恒定的地址。

答案 2 :(得分:0)

该函数仅在返回控件后销毁值。

因此,在遇到return语句时,将“Hello”置于返回值,然后函数销毁范围; < / p>

答案 3 :(得分:-1)

看看这个:Is returning a string literal address from a function safe and portable?

即使删除了字符串(使用malloc()和free()进行局部变量或动态分配),当返回指针时,该值也可以是正确的。但是,这是一种不确定的行为。