【C/C++】指针赋初值问题

本文阐述了指针在编程中未初始化可能导致的nullpointerdereference错误,强调了定义时必须初始化的重要性。通过实例展示了指针的正确使用方法,包括初始化指向变量、动态内存分配和适配通用接口等,并分享了开发中关于指针管理的经验教训。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先说结论:指针在使用时一定要进行初始化。

一、问题来源

问题提示:null pointer dereference.

此问题在编译时无误,在运行时出的问题,排查起来非常头疼。

一开始没头绪,经同事一起排查,定位为指针定义时未初始化导致。

解引用:解析指针变量所指向地址中的内容,空指针解引用会报错。

二、指针使用浅总结

1、在定义时初始化指向另一变量

int m=1;
int *n=&m;    // 指针n指向int类型空间的变量m

2、在初始化时使用malloc或new为其分配堆空间

一般较少使用,使用new分配空间后,后面一定要对其进行释放,否则容易造成内存泄漏。

typedef struct test{
       int m;
       int n;
}T;

void main()
{
    int k = 0;
    T *t = new T();    // C++ 
    // T *t = (T *)malloc(sizeof(T));    // C 语言
    k = t->m;
}

3、对于单个变量直接进行&操作

对于某些不需要指针的场景,可以进行变量声明后直接进行&操作。

4、定义时直接赋值为NULL

声明为NULL一定要为其分配明确的空间。

若指针后续未分配指向空间就直接使用,那么可以在编译期间就发现问题。

5、通用接口void*的适配问题

对于某些中间件的commn接口,形参往往定义为void *的形式。当我们进行实参传入时,需保证实参指向明确的地址。

void halSetEnable(BOOL param1)
{
    return param1;
}

void HalCommn(void* param1)
{
    halSetEnable(*(BOOL*)param1);      // 解引用操作,需保证入参有明确指向地址,不然对空指针解引用有问题
}

int SetEnable(BOOL bEnable)
{
    BOOL temp_enable = bEnable;        // 作用域为本函数

    HalCommn((void*)&temp_enable);     // 需保证实参在有明确的地址空间,不然后续解引用会有问题
}

三、小结

之前在开始开发纯C的裸机软件时指针的定义较为随意,经常会出现未初始化的过程,这块理解的缺失直到今天才爆发出来,需谨记!

### 回答1: 很高兴能够回答你的问题。给结构体指针数组初值的话,可以定义一个指针变量指向结构体,然后用循环给数组中的每一个元素值。例如,定义一个指针变量struct_ptr指向结构体,结构体定义如下:struct Stu{int a;int b;};,然后用循环给数组值:for(int i=0; i<len; i++){struct_ptr[i] = (struct Stu*)malloc(sizeof(struct Stu));struct_ptr[i]->a = i;struct_ptr[i]->b = i*i;} ### 回答2: 要给结构体指针数组初值,可以按照以下步骤进行: 1. 首先,定义一个结构体类型`struct MyStruct`,包含所需的字段。例如,我们假设该结构体有两个字段,分别是`int`类型的`num`和`char`类型的`name`。 2. 接下来,声明该结构体指针数组。例如,我们声明一个长度为3的结构体指针数组`struct MyStruct *ptrArray[3]`。 3. 为每个结构体指针分配内存空间,使用`malloc`函数。例如,可以使用`ptrArray[0] = (struct MyStruct*)malloc(sizeof(struct MyStruct))`语句为第一个结构体指针分配内存。 4. 给每个结构体指针的字段值。例如,可以使用`ptrArray[0]->num = 1`和`strcpy(ptrArray[0]->name, "John")`语句为第一个结构体指针的字段值。 5. 重复上述步骤3和步骤4,为其他结构体指针分配内存并值。例如,可以使用`ptrArray[1] = (struct MyStruct*)malloc(sizeof(struct MyStruct))`为第二个结构体指针分配内存,并使用相应的值语句给字段值。 6. 最后,记得在使用完结构体指针数组后,释放每个结构体指针所占的内存空间。可以使用`free`函数释放内存,例如`free(ptrArray[0])`。 通过以上步骤,我们可以成功给结构体指针数组初值。记得在编写代码时,注意检查内存分配是否成功以及是否正确释放内存,以避免内存泄漏或其他问题的发生。 ### 回答3: 给结构体指针数组初值的方法有几种。下面我将一一进行介绍。 方法一:逐个为结构体指针数组元素值。 这种方法比较繁琐,需要逐个为结构体指针数组的元素值。 例如,定义一个结构体类型为Student,包含姓名和年龄两个成员变量。 ``` typedef struct { char name[20]; int age; } Student; ``` 然后定义一个结构体指针数组,并逐个为其中的元素值。 ``` Student* students[3]; Student s1 = {"张三", 20}; Student s2 = {"李四", 22}; Student s3 = {"王五", 21}; students[0] = &s1; students[1] = &s2; students[2] = &s3; ``` 方法二:使用静态初始化语法。 这种方法可以在定义结构体指针数组的同时为其初值。 ``` Student* students[3] = { &(Student){"张三", 20}, &(Student){"李四", 22}, &(Student){"王五", 21} }; ``` 通过静态初始化语法,可以直接在大括号内初值给结构体指针数组的元素。 以上就是给结构体指针数组初值的两种常用方法。根据实际情况,可以选择合适的方法来初值
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱笑的七小沐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值