内存布局
- 栈(stack):方法调用,局部变量等,是连续的,高地址往低地址扩展
- 堆(heap):通过alloc等分配的对象,是离散的,低地址往高地址扩展,需要我们手动控制
- 未初始化数据(bss):未初始化的全局变量等
- 已初始化数据(data):已初始化的全局变量等
- 代码段(text):程序代码
2、64bit和32bit下 long 和char所占字节是不同的*
char:1字节(ASCII 2 = 256个字符)
char*(即指针变量):4个字节(32位的寻址空间是2,即32个bit,也就是4个字节。同理64位编译器为8个字节)
short int : 2个字节 范围 -2~> 2 即 -32768~>32767
int: 4个字节 范围 -2147483648~>2147483647
unsigned int : 4个字节
long: 4个字节 范围 和int一样 64位下8个字节,范围
-9223372036854775808~9223372036854775807long long: 8个字节 范围-9223372036854775808~9223372036854775807
unsigned long long: 8个字节 最大值:1844674407370955161
float: 4个字节
double: 8个字节。
3、static、const和sizeof关键字
static关键字
答:Static的用途主要有两个,一是用于修饰存储类型使之成为静态存储类型,二是用于修饰链接属性使之成为内部链接属性。
- 1、静态存储类型:
在函数内定义的静态局部变量,该变量存在内存的静态区,所以即使该函数运行结束,静态变量的值不会被销毁,函数下次运行时能仍用到这个值。
在函数外定义的静态变量——静态全局变量,该变量的作用域只能在定义该变量的文件中,不能被其他文件通过extern引用。
- 2、内部链接属性
静态函数只能在声明它的源文件中使用。
const关键字
- 1、声明常变量,使得指定的变量不能被修改。
const int a = 5;/*a的值一直为5,不能被改变*/
const int b; b = 10;/*b的值被赋值为10后,不能被改变*/
const int *ptr; /*ptr为指向整型常量的指针,ptr的值可以修改,但不能修改其所指向的值*/
int *const ptr;/*ptr为指向整型的常量指针,ptr的值不能修改,但可以修改其所指向的值*/
const int *const ptr;/*ptr为指向整型常量的常量指针,ptr及其指向的值都不能修改*/
- 2、修饰函数形参,使得形参在函数内不能被修改,表示输入参数。
如
int fun(const int a);或int fun(const char *str);
- 3、修饰函数返回值,使得函数的返回值不能被修改。
const char *getstr(void);使用:const *str= getstr();
const int getint(void); 使用:const int a =getint();
sizeof关键字
sizeof是在编译阶段处理,且不能被编译为机器码。sizeof的结果等于对象或类型所占的内存字节数。sizeof的返回值类型为size_t。
-
变量:int a; sizeof(a)为4;
-
指针:int *p; sizeof(p)为4;
-
数组:int b[10]; sizeof(b)为数组的大小,4*10;int c[0]; sizeof(c)等于0
-
结构体:struct (int a; char ch;)s1; sizeof(s1)为8 与结构体字节对齐有关。
对结构体求sizeof时,有两个原则:
(1)展开后的结构体的第一个成员的偏移量应当是被展开的结构体中最大的成员的整数倍。
(2)结构体大小必须是所有成员大小的整数倍,这里所有成员计算的是展开后的成员,而不是将嵌套的结构体当做一个整体。
-
注意:不能对结构体中的位域成员使用sizeof
- sizeof(void)等于1
- sizeof(void *)等于4
网友评论