堆栈内存基础

Jit*_*esh 3 c stack

考虑以下代码:

 char* foo(int myNum) {
    char* StrArray[5] = {"TEST","ABC","XYZ","AA","BB"};

    return StrArray[4];
 }
Run Code Online (Sandbox Code Playgroud)

当我回到StrArray[4]呼叫者时,这应该有用吗?由于数组是在堆栈上定义的,当调用者获取指针时,该部分内存已超出范围.或者这个代码会起作用吗?

Gre*_*ill 8

这段代码可行.您将返回指针的,该指向StrArray[4]常量字符串"BB".常量字符串的生命周期等于整个程序的生命周期.

最重要的是什么指针所指向的寿命,不要在那里指针存储.例如,下面类似的代码将不会工作:

char* foo(int myNum) {
   char bb[3] = "BB";
   char* StrArray[5] = {"TEST","ABC","XYZ","AA",bb};

   return StrArray[4];
}
Run Code Online (Sandbox Code Playgroud)

这是因为bb数组是foo()函数堆栈上的临时值,并在返回时消失.

  • @Amit:你错了,原来的问题是返回指向StrArray [4]指向的指针,即"BB". (3认同)
  • 强制性的迂腐评论:):聚合初始化程序中的`bb`只能在C99中允许,但在C89/90中不允许.后者只允许在聚合初始化器中使用常量表达式,而上述`bb`则不然. (3认同)
  • 作为附加说明 - 在C中,字符串文字具有静态存储持续时间(它将一直存在直到应用程序结束..).数组在函数范围的末尾消失了 - 但字符串文字不是 (2认同)