任何形式的未初始化的声明的变量,在编译时都会分配相应的空间

来源:互联网 发布:java protected关键字 编辑:程序博客网 时间:2024/04/28 07:33

任何形式的未初始化的声明的变量,在编译时都会分配相应的空间。或许我们会奇怪为什么有时候声明的某些数据类型,比如结构体指针、类指针、链表指针等在使用前还需要分配空间。这里要注意的是,声明的是指针变量,所以若没有初始化编译时是给指针变量分配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的该类型的值。

0 0
原创粉丝点击