变量的内存分布
2010-05-02 16:54
176 查看
const变量存储在.rodata(read only)区域;
char* p = "abcd"; p指向的是静态文本区域.text
.rodata 和 .text 被合并为一个segment,由OS保护起来,只可读。
register变量存放在.bss区域;
局部变量存放在栈空间,static变量存放在静态存储空间 (.data)
.bss 和.data 被合并为一个segment,可读可写。
变量在内存中的不同位置,影响着变量的读写方式。程序1很正常,因为p在栈上,可以修改。
程序2就会出错。因为对于全局区域的值,程序员是不可以修改的。
如果想要修改其值,可以声明为静态变量,这样编译器会在静态存储区域分配一块空间。如程序3:
另外,一个类中的静态成员变量时不占这个类的存储空间的。
比如class A{}; class B{static int M;};
sizeof(A) = sizeof(B) = 1
静态成员应该在类定义体的外部初始化。static int B::M = 6;
const成员应该在初始化列表中初始化,除此之外,没有任何地方可以改变它的值。
char* p = "abcd"; p指向的是静态文本区域.text
.rodata 和 .text 被合并为一个segment,由OS保护起来,只可读。
register变量存放在.bss区域;
局部变量存放在栈空间,static变量存放在静态存储空间 (.data)
.bss 和.data 被合并为一个segment,可读可写。
变量在内存中的不同位置,影响着变量的读写方式。程序1很正常,因为p在栈上,可以修改。
const char * strA() { char p[] = "hello"; p[0] = 'm'; return p; }
程序2就会出错。因为对于全局区域的值,程序员是不可以修改的。
const char * strA() { char *p = "hello"; p[0] = 'm'; //内存访问错误 return p; }
如果想要修改其值,可以声明为静态变量,这样编译器会在静态存储区域分配一块空间。如程序3:
const char * strA() { static char p[] = "hello"; //注意这里分配的是数组空间,不同于上面的指针。如果是static char * p, 说明指针p占用的4个字节在静态区域可修改,但它所指的内存“hello”仍然在全局区域,不可以修改。 p[0] = 'm'; //OK return p; }
另外,一个类中的静态成员变量时不占这个类的存储空间的。
比如class A{}; class B{static int M;};
sizeof(A) = sizeof(B) = 1
静态成员应该在类定义体的外部初始化。static int B::M = 6;
const成员应该在初始化列表中初始化,除此之外,没有任何地方可以改变它的值。
相关文章推荐
- C/C++变量在内存中的分布
- C/C++内存分布与变量初始化顺序
- java的对象、对象句柄、变量等在内存的分布
- 类中成员变量在内存中的分布是怎样的?---3
- C/C++变量在内存中的分布
- 关于C语言变量生存周期、作用域、内存分布、默认值的基本总结
- 2015年5月1日 转载--各种变量在内存中的分布
- C/C++变量在内存中的分布
- 浅析C/C++变量在内存中的分布
- C/C++变量在内存中的分布
- C/C++变量在内存中的分布
- C/C++变量在内存中的分布
- C/C++变量在内存中的分布
- C/C++变量在内存中的分布
- 结构体(或者联合体)变量的成员在内存里是如何分布的
- 程序中的变量是如何在内存中分布
- [C++]变量的内存分布
- C/C++变量在内存中的分布
- 各种变量在内存中的分布
- C/C++变量在内存中的分布