指针和内存范围

XrM*_*XrM 7 c memory variables pointers local

我已经编程C一段时间了(但对C来说还是很新)我有时会对C处理内存的方式感到困惑.

请考虑遵循有效的C片段:

const char *string(void)
{
       /* where is this pointer variable located in the memory? */
       const char *s;

       /* where is this text data located in the memory? */
       /* and when the program allocates memory for it?  */
       s = "Hello, World";

       return s;
}

int main(void)
{
    printf( "%s", string() );

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我在问记忆中究竟发生了什么?指针变量's'不是局部变量,或者指针变量存储在内存中的位置.另外文本常量"Hello,World"存储在内存中(这不是被认为是函数返回后无法访问的局部变量)吗?

基本上什么样的变量/数据被认为是在函数的"局部"范围内(在函数返回后不再可访问)?

我希望你明白我想说的话:D ..我想我有很多关于编译器和可执行文件的知识,所以请随意赐教!

Dig*_*oss 4

我想问一下内存中到底发生了什么?

局部变量在堆栈上分配。常量(包括文字字符串)被分配在可执行文件的文本或数据部分中。

指针变量不是局部变量吗?

是的

或者说指针变量存放在内存的什么地方?

本地s位于寄存器或堆栈中。

另外,文本常量“Hello, World”存储在内存中的哪里?

在 .text 或 .data 部分。它是不变的,但遗留代码有时会修改它们,因此它取决于编译器选项。您需要区分引用和对象才能理解这一切。

(这不是被认为是函数返回后不可访问的局部变量吗)?

嗯,s是本地的,但每次调用函数时都需要字符串本身,并且在这种情况发生之前本地框架甚至不会存在,因此常量本身很可能存储在 .text 部分中。它可能存储在 .data 中,具体取决于编译器选项以及当前编译器版本对编译遗留代码的关心程度。表达式内的文字与它所分配的变量完全不同。

基本上什么样的变量/数据被认为是在函数的“本地”范围内(函数返回后不再可访问)?

词法作用域为auto变量的变量,即在没有static存储类的函数内部声明的变量。不幸的是这个词accessible有点不精确。对于静态存储类,如果对象的地址从函数中泄漏,则可以引用该对象。