May*_*urK 1 c stack memory-management
我有一个简单的代码.
#define MY_STRING "String example"
char* string_return_function()
{
return MY_STRING;
}
Run Code Online (Sandbox Code Playgroud)
上面的代码有效,但我不知道如何.我认为string_return_function()返回一个本地地址,一旦该函数退出就会被释放.
不,这不是它的工作原理.
字符串文字存储在内存中,只要程序运行就会持续存在,因此该函数只返回指向字符串常量的指针.
在运行时没有发生字符串创建/初始化,没有复制任何字符.它只是返回一个指针,该函数的机器代码可能只是几个指令.
例如,这是我从https://assembly.ynh.io/获得的(清理过的)x86代码:
string_return_function:
movl $.LC0, %eax
ret
Run Code Online (Sandbox Code Playgroud)
在哪里.LC0
只是一个持有字符串的位置.那么,这是2条指令,包括从功能开销/样板回归.很有效率.:)
你在想这个:
char * bad_code(void)
{
char response[] = MY_STRING;
return response;
}
Run Code Online (Sandbox Code Playgroud)
这是错误的代码,因为它返回一个本地数组.有问题的数组是从文字初始化的,这不是什么被返回.
另外,不要以函数开头命名str
,所有这些名称都保留; C11草案说:
以
str
,mem
或wcs
小写字母开头的函数名称可以添加到<string.h>
标题中的声明中.