一、野指针和空指针
https://blog.youkuaiyun.com/qq_43727529/article/details/121365551
野指针:指针指向某个未被分配给该指针的随机地址。
空指针:指针指向0(NULL)
错误用例:
int a = 100;
int *p;
p = a; //把a的值赋值给指针变量p,p指向100地址,p为野指针,不会有问题,但没有意义
p = 0x12345678; //给指针变量p赋值,p指向随机地址0x12345678,p为野指针,不会有问题,但没有意义
*p = 1000; //对野指针进行赋值操作就不可以了
int main()
{
int * p; //存在栈中,随机初始值,故指向随机地址,为野指针
*p = 20;
return 0;
}
正确用例:
**初始化和赋值**
int main()
{
int *p = NULL;
int a = 10;
p = &a;
*p = 20;
return 0;
}
**和malloc使用**
int main()
{
int *p = NULL; //空指针,指向0,即没有指向任何地址
p = malloc(10 * sizeof(int)); //分配指向堆中某地址0xYYYYYYYY
if (!p)
{
return;
}
//成功开辟内存,可以操作内存。
free(p); //内存空间释放,0xYYYYYYYY不再被p占用,但p现在指向0xYYYYYYYY,为野指针
p = NULL; //p指向0,为空指针
return 0;
}
二、结构体指针的使用
S_WLAN_AD *ptAd = NULL; //声明和初始化为空指针
ptAd = (S_WLAN_AD *)malloc(sizeof(S_WLAN_AD) * AD_MAX); //分配内存
if (NULL == ptAd)
{
LogError("malloc failed.");
return FAILED;
}
memset(ptAd, 0, sizeof(S_WLAN_AD) * AD_MAX); //内存初始化为0
/* TODO: 对指针操作 */
free(ptAd); //释放内存
ptAd = NULL; //指针置为NULL,空指针
三、结构体初始化
结构体初始化并内存置零的方法:
https://blog.youkuaiyun.com/u013020969/article/details/130247676
1、使用{0},赋值为0
struct MyStruct {
int a;
char b;
float c;
};
struct MyStruct myStruct = { 0 };
2、memset
struct MyStruct myStruct;
memset(&myStruct, 0, sizeof(struct MyStruct));