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 = &num; 

指针作为实参进行参数传递时,该指针就已经退化成了数组,使用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. 野指针

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

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;   //这一行给指针置空必不可少,否则很可能后面操作了这个野指针而不自知,从而导致出现严重的问题
 

  • 10
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值