返回本地引用或指针时的行为差异

San*_*eep 2 c++

#include <iostream.h>
using namespace std;

class A {
public:
   virtual char* func()=0;
};

class B :public A {
public:
   void show() {
      char * a;
      a = func();
      cout << "The First Character of string is " << *a;
   }
   char * func();
};


char* B::func() {
   cout << "In B" << endl;
   char x[] = "String";
   return x;
}

int main() {
   B b;
   b.show();
}
Run Code Online (Sandbox Code Playgroud)

这个问题是我正在修复本地varibale指针/引用.目前它是char x[]="String",但是当我使用指针时char *x="String",结果是"S" 但当数组引用时输出为(i)

Jer*_*fin 6

当你做类似的事情时:

char *f(){ return "static string"; }
Run Code Online (Sandbox Code Playgroud)

您将返回字符串文字的地址,但该字符串文字不是函数的本地字符.相反,它是静态分配的,因此返回它会给出明确定义的结果(即字符串在函数退出后继续存在,因此它可以工作).

当你(尝试)返回像这样的char数组的地址时:

char *f() { 
   char x[] = "automatically allocated space"; 
   return x; 
}
Run Code Online (Sandbox Code Playgroud)

编译器x在堆栈上分配空间,然后从您没有直接访问权限的字符串文字初始化它.你要返回的是堆栈中内存的地址,而不是字符串文本本身 - 所以一旦函数退出,该数组就不再存在,你不知道该地址还有什么东西可以存放.尝试使用该地址会导致未定义的行为,这意味着任何事情都可能发生.