我已经对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;
}

我在问记忆中到底发生了什么?
指针变量“s”不是局部变量,也不是存储在内存中的指针变量的位置。另外,存储在内存中的文本常量“hello,world”在哪里(这不是被认为是函数返回后不可访问的局部变量吗)?
基本上,什么类型的变量/数据被认为在函数的“局部”范围内(函数返回后不再可访问)?
我希望你明白我想说的话:D.。我想我有很多要学习的编译器和可执行文件,所以请随意启发我!

最佳答案

我在问记忆中到底发生了什么?
正在堆栈上分配局部变量。
常量(包括文本字符串)正在可执行文件的文本或数据部分中分配。
指针变量“s”不是局部变量吗?
是的
或者指针变量存储在内存中的什么位置?
本地s在寄存器或堆栈中。
文本常量“hello,world”存储在内存中的什么地方?
在.text或.data节中。它是常量,但遗留代码有时会修改它们,因此它取决于编译器选项。您需要区分引用和对象,才能完全理解它。
(这不是被认为是函数返回后不可访问的局部变量吗)?
好吧,s是本地的,但是每次调用函数时都需要字符串本身,并且在调用之前本地帧甚至不存在,所以常量本身很可能存储在.text节中。它可能存储在.data中,这取决于编译器选项以及当前编译器版本对编译遗留代码的关注程度。表达式中的文本与它所分配的变量完全不同。
基本上,什么类型的变量/数据被认为在函数的“局部”范围内(函数返回后不再可访问)?
词法上范围为auto变量的变量,即在没有static存储类的函数内部声明的变量。不幸的是,这个词有点不精确。对于静态存储类,如果对象的地址从函数中泄漏,则可以引用该对象。

10-05 20:58
查看更多