zoukankan      html  css  js  c++  java
  • [整理]C中的静态存储区

    静态存储区:即内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。它主要存放静态数据、全局数据和常量。
    栈区:在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。

    int main(void)
    {   
    	char a[] = "Hello World 1";	//
    	char *p = "Hello World 2";	//
    	char* p1 = "Hello World 1";	//
    
    	a[2] = '9';
    	p[2] = '9';//运行出错,提示内存为不可写
    
    	return 0;
    }
    

     p[2] = '9';运行出错,提示内存为不可写,为什么呢?

    变量p和数组a都存在于栈区的(任何临时变量都是处于栈区的);但是,数据“Hello World1”和数据“Hello World2”是存储于不同的区域的。
    数据“Hello World1”存在于数组中,所以,此数据存储于栈区,可以修改其内容。


    指针p存储某个存储空间的地址,数据“Hello World1”为字符串常量,所以存储在静态存储区。虽然通过p[2]可以访问到静态存储区中的第三个数据单元,即字符‘l’所在的存储的单元。但是因为数据“Hello World1”为字符串常量,不可以改变,所以在程序运行时,会报告内存错误。

    并且,如果此时对p和p1输出的时候会发现p和p1里面保存的地址是完全相同的。换句话说,在数据区只保留一份相同的数据。

    总之
    当p是一个指针,指向一个字符串常量,之后可以被修改为指向其他地址,但是如果试图修改字符串的内容,结果将不确定,
    即p指向字符串常量的话,这段常量字符串是存储在静态存储区的,内容不能修改。

  • 相关阅读:
    (转+原)python中的浅拷贝和深拷贝
    (原)torch7中添加新的层
    (原+转)ubuntu终端输出彩色文字
    (原)torch中显示nn.Sequential()网络的详细情况
    (原)python中使用plt.show()时显示图像
    eclipse 注释模板
    leetcode 11 最大盛水容器
    leetcode 9 回文数字
    leetcode8 字符串转整数
    利用Intent启动activity的例子
  • 原文地址:https://www.cnblogs.com/Benoly/p/3803843.html
Copyright © 2011-2022 走看看