有这个代码
const char* get_msg(){
const char str[] = "get_msg";
return str;
}
#include <stdio.h>
int main(){
printf("%s\n", get_msg());
}
编译时,它会产生
警告:函数返回局部变量的地址 [-Wreturn-local-addr]
当然,应用程序在执行时会崩溃。我明白为什么会发生这种情况,因为字符串位于堆栈上,并且在函数返回值后被销毁。
但是,如果函数像这样重写
const char* get_msg(){
return "get_msg";
}
那既不存在,也不存在 Varningov 或 Falling。我对return "get_msg"; 的工作原理感兴趣;?原来这一行是在堆栈上的?或者在哪里?毕竟,从逻辑上讲,这一行应该在函数返回后“消失”。
我这样编译: gcc main.c -o main
这里
为堆栈上的数组分配空间
str
,并用字符串填充"get_msg"
(字符串文字被复制到堆栈上的数组)。然后该函数返回该数组的地址。正确的
返回某个内存中存储字符串文字的位置的地址(简单来说,这个位置取决于编译器、操作系统等)。那些。该地址将指向内存中的实际位置,而前一个地址
return
将返回指向堆栈上位置的指针。该字符串
"get_msg"
作为静态数据存储在程序中的一个受保护的区域中,以防止更改。大约是这样的:
标准是这样说的:
该字符串
const char str[] = "get_msg";
作为副本存储在堆栈中。并且在函数结束后,访问字符串将导致未定义的行为。return "get_msg";
如果您返回静态未命名字符串的地址,那么您始终可以访问它,只需不要更改它即可。代码
相当于代码