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指向字符串常量的话,这段常量字符串是存储在静态存储区的,内容不能修改。

  • 相关阅读:
    面向对象七大设计原则
    S2第六章
    S2第四章
    大数据Hadoop——HDFS Shell操作
    大数据Hadoop——初识Hadoop
    ssh整合oracle数据源报错????
    关于Struts2的通配方法、转发重定向
    SSH实现ajax
    关于Struts2自动装配和访问Servlet API
    Oracle函数
  • 原文地址:https://www.cnblogs.com/Benoly/p/3803843.html
Copyright © 2011-2022 走看看