waring:不要返回局部变量或临时变量的地址

例1

char *getstring(void){
       char p[]="hello everyone";
       return p;
}

int main(int argc, char* argv[]){
        printf("%s\n",getstring());
        return 0;
}

解析:char *getstring(void)函数中的p数组是局部变量,在栈空间。在函数调用结束后,局部变量销毁。但是这时函数返回值却是指向销毁内存的指针,这是野指针。千万不要返回局部变量的地址。在char p[]前加static就变成局部静态,生存期是整个程序执行期间,所以这时候返回它的指针可以读取这块空间

例2 牛客题目:

string& test_str(){
string str = "test";
return str;
}

int main(){
string& str_ref = test_str();
cout << str_ref << endl;
return 0;
}
A.编译警告

B.返回局部变量的引用,运行时出现未知错误

C.正常编译且运行

D.把代码里的&都去掉之后,程序可以正常运行

答案:A B D

分析:在C语言中,局部变量是分配在栈空间上的, 当函数调用结束后,由编译器释放.

通过调用test_str得到了他的局部变量的内存地址, 然而在main函数中调用函数时,这个内存地址被”破坏”了, 所以出现了这个意想不到的结果.

所以我们在书写C语言程序时候, 如果返回指针(变量地址),应该返回堆区或者全局区的,这样就可以避免这个”意想不到的”结果

reference:
原文:https://blog.csdn.net/u012222482/article/details/52458429

原文:https://blog.csdn.net/chenzhen1213/article/details/43833313

你可能感兴趣的:(C,C++)