结构体指针&指针

[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]函数参数是二级指针

如果修改实参指针指向时就需要用到二级指针
如果传入参数是一级指针数组时需要用到二级指针

在这里插入图片描述

参考链接-关于C语言二级指针正确使用总结

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值