Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 指针和内存范围_C_Memory_Variables_Pointers_Local - Fatal编程技术网

C 指针和内存范围

C 指针和内存范围,c,memory,variables,pointers,local,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 whe

我编写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”在哪里(这不被认为是函数返回后不可访问的局部变量吗)

基本上什么样的变量/数据被认为是在函数的“局部”范围内(在函数返回之后不能访问)?< /P>
我希望你能理解我想说的:D。。我想我有很多关于编译器和可执行文件的知识需要学习,所以请随时告诉我

编译器已经准备好字符串
“Hello,World”
的存储,以便在加载应用程序时它有自己的内存地址


然后当你的代码
s=“你好,世界”运行时,您正在将编译字符串的内存地址复制到指针
s
。没有为字符串分配额外的内存,并且
s
本身是一个局部变量(指针),暂时占用堆栈上的空间。

s=“Hello,World”
s
是一个局部变量,而作为字符串文本的
“Hello World”
存储在内存的常量区域中,并具有静态存储持续时间<当函数返回时,code>s
会被销毁,但字符串literal
“Hello World”
不会

s
在堆栈上,当
string()
返回时,它就不存在了。文字字符串存储在程序的只读数据中(这可能是程序代码的一部分,也可能不是,取决于编译器和操作系统);使用
gcc
,您可以通过使用
-fwritable strings
编译使其成为读写初始化数据的一部分,但这是一个坏主意(它主要是为那些希望字符串文本可写的古代程序提供的)。

我想知道内存中到底发生了什么

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

指针变量不是局部变量吗

或者指针变量存储在内存中的什么位置

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

还有,内存中存储的文本常量“Hello,World”在哪里

在.text或.data节中。它是常量,但遗留代码有时会修改它们,因此它取决于编译器选项。您需要区分引用和对象才能理解所有内容

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

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

基本上什么样的变量/数据被认为是在函数的“局部”范围内(在函数返回之后不能访问)?< /P> 词汇范围为
auto
变量的变量,即在没有
static
存储类的函数内声明的变量。不幸的是,
accessible
这个词有点不精确。使用静态存储类,如果对象的地址从函数中泄漏,则可以引用该对象。

试试这个。五月工作

#include static char* str1(void){ static char* s="abc"; return s; } int main(int argc,char* argv[]){ printf("%s\n",str1()); return 0; } #包括 静态字符*str1(无效){ 静态字符*s=“abc”; 返回s; } int main(int argc,char*argv[]){ printf(“%s\n”,str1()); 返回0; } “const”是“不应保留值”。 变量的“static”是“static allocated”。 (您正在返回一个静态字符串)


变量s指向“静态分配”的区域。

您的代码没有意义,您没有返回任何要打印的内容。GWW:我假设XrM打算
返回s,我进行了相应的编辑。您正在响应的“0”(我编辑了它,因为我假设XrM的意思是
返回s;
是一个与任何指针类型兼容的值。它是一个空指针。另一方面,将它作为参数传递给
printf
,可能是一个糟糕的主意。如果我写了“return 0;”,那我就错了。我的意思是“return s;”当然。好的,谢谢大家。不,我的理解好多了。所以基本上,当调用函数“string()”时,它会将“Hello,World”字符串文本的地址分配给局部变量“s”,然后返回变量“s”指向的地址。之后,“s”会被“销毁”当函数返回.Si时,但该值为常量且持续存在。