C语言变量的初始化

一、前言

C语言的变量如果未初始化,其变量值是随机的,特别是对指针而言,很容易导致程序崩溃。

二、各类型变量初始化方法

1. 数值型

整型、浮点型的变量可以在定义的同时进行初始化,一般都初始化为0。

int num1 = 0;

float num2 = 0.00f;

double num3 = 0.00;

2. 字符型

字符型变量也可在定义的同时进行初始化,一般初始化为'0'。

char ch = '\0';

3. 字符串

方法一:使用空字符串进行初始化

char str[10] = "";

方法二:使用memset函数

char str[10];

memset(str, 0, sizeof(str));

方法三:循环赋值

char str[10];

for(int i = 0; i < 10; i++)

{

str[i] = '\0';

}

4. 指针

一般来说,指针都是初始化为NULL。

int *p = NULL;

int num = 0;

p = #

指针作为实参进行参数传递时,该指针就已经退化成了数组,使用memset来对该指针进行初始化是毫无意义的。指针首先保存的是一个4字节的地址,所以sizeof(pstr)永远只能 = 4。

5. 结构体

结构体一般使用memset函数进行初始化。

typedef struct Student

{

int id;

char name[20];

char sex;

}STU;

STU stu;

memset((char *)&stu, 0, sizeof(stu)); // 方式一

memset((char *)&stu, 0, sizeof(STU)); // 方式二

结构体数组的初始化

STU stus[10];

memset((char *)&stus, 0, sizeof(stus)); //正确,数组本身在内存里就是连续的,sizeof取出的就是数组的字节长度

memset((char *)&stus, 0, sizeof(STU)*10); //正确,效果与第一个是一样的

memset((char *)&stus, 0, sizeof(STU)); //错误,只会初始化第一个STU结构体,后面还有9个STU元素并未初始化

6. 数组的初始化

数组的初始化与字符串的初始化有类似之处,下文以整型数组为例。

方法一:使用{0}进行初始化

char array[10] = {0}; //声明时使用{0}初始化为全0

方法二:使用memset函数

由于memdset函数是按字节进行填充,因此初始值一般设为0或-1。

char array[10];

memset(array, 0, 10);

方法三:循环赋值

char array[10];

for (i = 0; i < 10; i++)

{

array[i] = 0;

}

附录

1. memset函数

int num;

memset(&num, 0, sizeof(int));

printf("step1=%d\n", num);

memset(&num, 1, sizeof(int));

printf("step2=%d\n", num);

上述代码运行结果:

step1 = 0 step2 = 16843009

memset是按照字节进行填充,int型在64位计算机上是4个字节。

step1 的结果就是将4个字节全部填充0,如下:

00000000 00000000 00000000 00000000

而 step2 则是将每个字节都填充为1,如下:

00000001 00000001 00000001 00000001

2. 野指针

在动态内存管理中,由于变量的内存是分配在堆中的,所以一般用malloc、calloc等函数申请过动态内存,在使用完后需要及时释放,一般释放掉动态内存后要及时将指针置空,否则将变为野指针,可能造成程序崩溃。

char *p = NULL;

p=(char *)malloc(100);

if(NULL == p)

{

printf("Memory Allocated at: %x\n",p);

}

else

{

printf("Not Enough Memory!\n");

}

free(p);

p = NULL; //这一行给指针置空必不可少,否则很可能后面操作了这个野指针而不自知,从而导致出现严重的问题

探索移动177号段的优势与发展前景(177号段成为移动通信领域的新宠儿,开启移动时代的新纪元)|鹦鹉一直上下摇头是怎么回事