C语言指针申明的变量都存储在静态区吗

Python018

C语言指针申明的变量都存储在静态区吗,第1张

首先在C语言中,所有的字符串(注意不是数组字符串),都属于静态储存类别的,也就是C规定字符串必须为存放在静态栈。

你用指针str指向了"helloworld"的地址,所以str也是指导了静态栈之中,如果你用数组来声明字符串就不会是这个样子了。

char str[ ]="helloworld":表示首先在静态栈创建"helloworld",然后再把静态栈的字符串字面量(就是字符串的内容)拷贝到str数组之中;

你用 p指向了整数10的地址,指针是存放在动态栈中的,一旦遇到{号就被清空了,直到下一次被调用

楼主问这样的问题,需要澄清平台。比如windows下的与linux下的编译器及很多嵌入式C编译器不同。为什么考虑嵌入式C?原因是目前C语言的很大市场在嵌入式领域。windows下,除了某些特殊需要,java,C++,C#已经优势尽显了。

另外,讨论了半天,q在你代码的那里?我怎么没找到??我眼睛都揉红了也没找见呀

只好表述一下原理

VC下:

1. 函数形参和函数内部非静态局部变量都在栈上分配(所以a,b,p本身都在栈上。但p指向的内容在堆上。q在哪里,我找不到)。

栈的分配的方法是:sp-=字数。

sp是堆栈指针。”字数“是说:你分配一个字节的局部变量,编译器也给你一个字的长度的空间。原因是,堆栈是具有字长度的。16位、32位机器下,字长度为16,64位机器下,字长度为32.

而且,windows下,栈是从高地址向低地址增长的。为什么?栈与堆共享空间,并且,堆从低向高长,栈从高向低长,降低溢出风险。

静态区名字本身就说明了他的特性:静止的,不随程序的运行变化。也就是相对的说,堆和栈都是动态的。静态区是编译器在编译时指定长度、链接时定位地址、windows载入器载入时分配内存。

这里的动与静是编译器和链接器的说法,是语言层面。不适用于系统层面。Windows随时可能将任何用户程序程序的全部资源“请出”内存,也可重新载入,此时,什么静都是浮云。

还有返回值。楼主的main不返回值编译器会警告你的。返回值存在什么地方?

答案是寄存器里AX(EAX,DX,EDX等)。

嵌入式系统里可能这些都不适用。比如,某些嵌入式处理器的形参直接使用寄存器(R0~R15,或A、B等)

主要区别在于存储区域和作用时间。

C语言的数据区分为静态存储区与动态存储区。

静态存储是指在程序运行期间给变量分配固定存储空间的方式。如全局变量存放在静态存储区中,程序运行时分配空间,程序运行完释放。

动态存储是指在程序运行时根据实际需要动态分配存储空间的方式。如形式参数存放在动态存储区中,在函数调用时分配空间,调用完成释放。