任何形式的未初始化的声明的变量,在编译时都会分配相应的空间
2015-02-24 22:55
831 查看
任何形式的未初始化的声明的变量,在编译时都会分配相应的空间。或许我们会奇怪为什么有时候声明的某些数据类型,比如结构体指针、类指针、链表指针等在使用前还需要分配空间。这里要注意的是,声明的是指针变量,所以若没有初始化编译时是给指针变量分配4字节,而指针里面指向一个无法确定的地址,为了安全需要我们指定相应的空间并将该空间的地址付给指针变量。除了指针变量之外,其他变量(包括int,char, 数组,或自己定义的各种结构类型变量)都会按其相应的数据类型分配相应的空间。具体如下(VC):
int: 4k,
char: 1k,
指针: 4k,
结构: 和里面包含的数据类型有关,但不是简单的相加。
eg:int a;
char b;
char *c;
struct
{
int ID;
char n;
}student;
printf("%d,%d,%d,%d/n",sizeof(a),sizeof(b),sizeof(c),sizeof(student));
输出结果为:4,1,4,8
其次,未初始化变量的随机值:
当一个变量被声明(定义式声明)而没有被初始化,那么编译时会赋予随机值(伪随机)分配一个值。对于指针变量,VC会自动把0xcccccccc赋给它,而它所指向的空间不是我们想要的,所以在我们给它分配我们指定的空间地址之前它是危险的。
在单步调试时会警告提示:
在运行时会有错误提示:
此时若点击继续或忽略会有错误提示(因为要访问地址指向的空间):
对于int型若未初始化,
警告提示没有初始化
会赋予它一个很小的负数,若以整型输出则为该负数,若以字符型输出则为“?”;
对于char型未初始化,警告提示未初始化,赋予一个负的整数(如-52),整型输出-52,字符输出“?”;
对于char型指定长度的数组n[],此时空间已经确定,而其中每个n[i]都自动赋予-52,若以单个字符输出则为多个问号,“??????”;若以%s输出则为乱码,“烫烫烫烫烫烫烫烫”。
这里说一下字符数组和指针不同的提示和结果的原因:
指针所指向的为一个非法的空间,所以先提示未初始化,继续后提示不能访问并且结果输出因输出方式而定;而声明的数组在编译时分配了自己相应的空间,所以先提示未初始化,继续后 输出问号或乱码。
第三,变量的非运算(!)
:
!运算是将一个变量的值取反(一般0和1),具体如下:
指针p,若p非0x00000000,则(!p)为0x00000000,p和非p整形输出为非零整和0;若p为0x00000000,则(!p)为0x00000001,整型输出为0和1;
整型m,字符型c,略;
注意结构体等类型的数据不能取非,否则会错误提示“该类型作为表达式非法”。
最后,变量置空:
将变量置空可认为是将该变量的值置为等价于整数0的该类型的值。
int: 4k,
char: 1k,
指针: 4k,
结构: 和里面包含的数据类型有关,但不是简单的相加。
eg:int a;
char b;
char *c;
struct
{
int ID;
char n;
}student;
printf("%d,%d,%d,%d/n",sizeof(a),sizeof(b),sizeof(c),sizeof(student));
输出结果为:4,1,4,8
其次,未初始化变量的随机值:
当一个变量被声明(定义式声明)而没有被初始化,那么编译时会赋予随机值(伪随机)分配一个值。对于指针变量,VC会自动把0xcccccccc赋给它,而它所指向的空间不是我们想要的,所以在我们给它分配我们指定的空间地址之前它是危险的。
在单步调试时会警告提示:
在运行时会有错误提示:
此时若点击继续或忽略会有错误提示(因为要访问地址指向的空间):
对于int型若未初始化,
警告提示没有初始化
会赋予它一个很小的负数,若以整型输出则为该负数,若以字符型输出则为“?”;
对于char型未初始化,警告提示未初始化,赋予一个负的整数(如-52),整型输出-52,字符输出“?”;
对于char型指定长度的数组n[],此时空间已经确定,而其中每个n[i]都自动赋予-52,若以单个字符输出则为多个问号,“??????”;若以%s输出则为乱码,“烫烫烫烫烫烫烫烫”。
这里说一下字符数组和指针不同的提示和结果的原因:
指针所指向的为一个非法的空间,所以先提示未初始化,继续后提示不能访问并且结果输出因输出方式而定;而声明的数组在编译时分配了自己相应的空间,所以先提示未初始化,继续后 输出问号或乱码。
第三,变量的非运算(!)
:
!运算是将一个变量的值取反(一般0和1),具体如下:
指针p,若p非0x00000000,则(!p)为0x00000000,p和非p整形输出为非零整和0;若p为0x00000000,则(!p)为0x00000001,整型输出为0和1;
整型m,字符型c,略;
注意结构体等类型的数据不能取非,否则会错误提示“该类型作为表达式非法”。
最后,变量置空:
将变量置空可认为是将该变量的值置为等价于整数0的该类型的值。
相关文章推荐
- 变量声明/空间分配/未初始化的随机值分配/变量非运算/变量置空
- 变量在编译时为其分配相应存储单元
- Java变量的声明、内存分配及初始化
- NSMutableArray 如果只进行了声明,而没有进行初始化,那么程序不会报错,但是,声明的那个变量不起任何作用
- Java变量的声明、内存分配及初始化
- 静态数据成员只能在类体外,且通过函数体进行初始化(静态数据成员是在程序编译时被分配空间的)
- 关于Java变量的声明、内存分配及初始化详解
- C中几个变量的区别:(特别是有程序分配空间的解释)
- C#基础:变量的声明、定义、初始化
- 给线程变量pthread_t *thread动态分配空间
- 如何声明一个全局变量,可以在应用的任何单元引用
- 成员变量的声明位置引起编译错误
- 定义一个函数求字符串的长度,要求该函数体内不能声明任何变量
- [C++再学习系列] 变量与声明时初始化
- 变量初始化规则以及声明和定义
- heap stack 堆栈 全局变量 静态变量 进程空间 内存分配
- 变量的定义,初始化和声明
- [基础]外部变量声明时,同时初始化变量的写法,包括Record类型。
- java 变量 分配内存空间的一道题
- 局部变量声明后最好立即初始化