堆栈内存基础

时间:2009-11-09 18:51:44

标签: c stack

考虑以下代码:

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

    return StrArray[4];
 }

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

5 个答案:

答案 0 :(得分:8)

此代码可以使用。您将返回StrArray[4]中指针的,它指向一个常量字符串"BB"。常量字符串的生命周期等于整个程序的生命周期。

重要的是指针指向的生命周期,而不是指针存储的位置。例如,以下类似的代码将工作:

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

   return StrArray[4];
}

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

答案 1 :(得分:4)

小心:你骗了编译器。

StrArray的每个元素都指向只读char * ;
你告诉编译器你的函数的返回值是可修改的 char *
欺骗编译器,它迟早会报复。

在C中,声明指向只读数据的方法是使用const来限定它。

我将你的代码编写为:

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

   return StrArray[4];
}

答案 2 :(得分:2)

代码可以使用。您要返回的点(StrArray[4])指向字符串文字"BB"。 C中的字符串文字是具有静态存储持续时间的匿名数组对象,这意味着只要程序存在(即永远),它们就会存在。在哪里创建sting文字并不重要。即使它是在函数内部引入的,它仍然具有静态存储持续时间。

请记住,字符串文字不可修改,因此最好使用带有字符串文字的const char*指针。

答案 3 :(得分:0)

C使用带有从0开始的标记的数组。所以第一个元素是StrArray [0]

因此,您的代码中未声明StrArray [5]。

C将允许您编写代码以返回StrArray [5],但是发生的情况是未定义的,并且在操作系统和编译器上会有所不同,但通常会使程序崩溃。

答案 4 :(得分:0)

只有指针数组在堆栈上,而不是string-literal-constants。