[0]定义,初始化
如果定义一个结构体类型的普通变量,可以不malloc动态申请内存,CPU会为这个结构体变量分配内存 如果定义的是一个结构体的指针,CPU会为这个指针开辟内存,但是此时这个大小是4(如果是32位的CPU的话),所以这个空间不足以存储结构体的数据成员,就会引发错误,此时必须要malloc申请一个,结构体类型大小的动态内存。
typedef struct a{
P_PE_HANDLE p_handle;
int a ;
}*p_a;
typedef struct pe_handle
{unsigned char *puchar_buf;
unsigned long ulong_size;
}PE_HANDLE, *P_PE_HANDLE;
//定义结构体”a“的指针并进行初始化
// 定义结构体 "a" 的指针
p_a myA;
// 为结构体 "a" 的指针分配内存并初始化数据成员
myA = (p_a)malloc(sizeof(struct a));
if (myA != NULL) {
// 初始化 p_handle 指向的 PE_HANDLE 结构体
myA->p_handle = (P_PE_HANDLE)malloc(sizeof(PE_HANDLE));
if (myA->p_handle != NULL) {
// 初始化 PE_HANDLE 结构体的数据成员
myA->p_handle->puchar_buf = NULL; // 根据需要分配内存并设置数据
myA->p_handle->ulong_size = 0; // 根据需要设置大小
// 初始化结构体 "a" 的整数成员 "a"
myA->a = 42; // 例如,将整数成员设置为 42
} else {
// 处理内存分配失败的情况
}
} else {
// 处理内存分配失败的情况
}
当结构体里面存着指针对象时,直接使用memset()函数初始化结构体,指针成员会被初始化为0即空指针。
1.正确的初始化操作是先对结构体中执行memset(也可逐项初始化),然后对指针成员分配空间,最后单独初始化该指针指向的空间。
2.memset()函数会把结构体里面的各成员的值初始化,指针对象这初始化为NULL指针,后面要使用时需先分配空间。
[1]函数内定义的指针
看 ptr1本身所指向的内存是不是**动态创建(malloc)**的。ptr1作为局部变量,退出函数时释放的是它自己所占用的空间。它所指向的空间并不会随着函数退出而释放。只要不是全局的,在函数退出时都会由系统收回(栈中)
func()
{
void* ptr1 = NULL;
//不需要free(ptr1)
}
[2]函数参数是一级指针
如果只是用指针修改指向单元内容时,只需要传入一级指针即可。
函数内部对指针参数申请的空间不对实参造成影响,因为函数内部str变量的值为malloc申请的内存地址,函数结束后,malloc申请的内存空间未消失,但是形参str的值随栈销毁而销毁。Iintara()传入的不是str的地址,而是指针指向的内存空间的地址。
[3]函数参数是二级指针
如果修改实参指针指向时就需要用到二级指针
如果传入参数是一级指针数组时需要用到二级指针