C语言变量的初始化

- 日理万妓 2024-04-01 12:44 120阅读 0赞

一、前言

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

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

1. 数值型

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

  1. int num1 = 0;
  2. float num2 = 0.00f;
  3. double num3 = 0.00;

2. 字符型

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

  1. char ch = '\0';

3. 字符串

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

  1. char str[10] = "";

方法二:使用memset函数

  1. char str[10];
  2. memset(str, 0, sizeof(str));

方法三:循环赋值

  1. char str[10];
  2. for(int i = 0; i < 10; i++)
  3. {
  4. str[i] = '\0';
  5. }

4. 指针

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

  1. int *p = NULL;
  2. int num = 0;
  3. p = &num;

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

5. 结构体

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

  1. typedef struct Student
  2. {
  3. int id;
  4. char name[20];
  5. char sex;
  6. }STU;
  7. STU stu;
  8. memset((char *)&stu, 0, sizeof(stu)); // 方式一
  9. memset((char *)&stu, 0, sizeof(STU)); // 方式二

结构体数组的初始化

  1. STU stus[10];
  2. memset((char *)&stus, 0, sizeof(stus)); //正确,数组本身在内存里就是连续的,sizeof取出的就是数组的字节长度
  3. memset((char *)&stus, 0, sizeof(STU)*10); //正确,效果与第一个是一样的
  4. memset((char *)&stus, 0, sizeof(STU)); //错误,只会初始化第一个STU结构体,后面还有9个STU元素并未初始化

6. 数组的初始化

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

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

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

方法二:使用memset函数

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

  1. char array[10];
  2. memset(array, 0, 10);

方法三:循环赋值

  1. char array[10];
  2. for (i = 0; i < 10; i++)
  3. {
  4. array[i] = 0;
  5. }

附录

1. memset函数

  1. int num
  2. memset(&num, 0, sizeof(int));
  3. printf("step1=%d\n", num);
  4. memset(&num, 1, sizeof(int));
  5. printf("step2=%d\n", num);

上述代码运行结果:

step1 = 0
step2 = 16843009

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

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

  1. 00000000 00000000 00000000 00000000

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

  1. 00000001 00000001 00000001 00000001

2. 野指针

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

  1. char *p = NULL;
  2. p=(char *)malloc(100);
  3. if(NULL == p)
  4. {
  5. printf("Memory Allocated at: %x\n",p);
  6. }
  7. else
  8. {
  9. printf("Not Enough Memory!\n");
  10. }
  11. free(p);
  12. p = NULL; //这一行给指针置空必不可少,否则很可能后面操作了这个野指针而不自知,从而导致出现严重的问题

发表评论

表情:
评论列表 (有 0 条评论,120人围观)

还没有评论,来说两句吧...

相关阅读

    相关 C语言变量初始化

    一、前言 C语言的变量如果未初始化,其变量值是随机的,特别是对指针而言,很容易导致程序崩溃。 二、各类型变量初始化方法 1. 数值型 整型、浮点型的变量可以

    相关 C++变量初始化问题

    初始化和赋值的区别 在C++中,变量初始化和赋值操作符是两个完全不同的概念。 初始化不是赋值,初始化的含义是创建变量分配存储空间时为其赋一个初始值,而赋值的含义是把内存空间