C语言的变量如果未初始化,其变量值是随机的,特别是对指针而言,很容易导致程序崩溃。
整型、浮点型的变量可以在定义的同时进行初始化,一般都初始化为0
。
int num1 = 0;
float num2 = 0.00f;
double num3 = 0.00;
字符型变量也可在定义的同时进行初始化,一般初始化为'0'。
char ch = '\0';
char str[10] = "";
char str[10];
memset(str, 0, sizeof(str));
char str[10];
for(int i = 0; i < 10; i++)
{
str[i] = '\0';
}
一般来说,指针都是初始化为NULL
。
int *p = NULL;
int num = 0;
p = #
指针作为实参进行参数传递时,该指针就已经退化成了数组,使用memset
来对该指针进行初始化是毫无意义的。指针首先保存的是一个4字节的地址,所以sizeof(pstr)
永远只能 = 4。
结构体一般使用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元素并未初始化
数组的初始化与字符串的初始化有类似之处,下文以整型数组为例。
char array[10] = {0}; //声明时使用{0}初始化为全0
由于memdset函数是按字节进行填充,因此初始值一般设为0或-1。
char array[10];
memset(array, 0, 10);
char array[10];
for (i = 0; i < 10; i++)
{
array[i] = 0;
}
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
在动态内存管理中,由于变量的内存是分配在堆中的,所以一般用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; //这一行给指针置空必不可少,否则很可能后面操作了这个野指针而不自知,从而导致出现严重的问题