为何要将结构体指针struct student *ptr初始化为NULL?
为什么要将结构体指针初始化为NULL?
在代码里写struct student *ptr = NULL;把指针初始化为NULL,主要有这几个原因:
避免野指针引发的未定义行为:声明指针时如果不初始化,它会指向内存里一个随机的垃圾地址(也就是所谓的"野指针")。要是不小心在给指针赋值有效地址前就去解引用它(比如误写代码提前用了
ptr->id这种操作),轻则程序崩溃,重则破坏其他内存区域的数据,引发难以排查的bug。而初始化为NULL后,我们可以通过if (ptr != NULL)这类判断来检查指针是否有效,从根源避免非法内存访问。提升代码可读性与安全性:显式把指针初始化为NULL,相当于给阅读代码的人一个明确信号:这个指针当前没有指向任何有效的内存空间。在复杂的代码逻辑里,这种清晰的初始状态能减少误解,也能避免因指针状态不明导致的逻辑错误。
遵循防御性编程规范:这是C语言里一种常见的防御性编程习惯,不管指针之后会不会马上被赋值,声明时都先初始化。这种习惯能帮你在代码后续修改(比如新增条件分支、调整执行顺序)时,避免因为遗漏指针赋值而产生野指针问题。
结合你给出的示例代码来看,虽然紧接着就执行了ptr = std;给指针赋了有效地址,但如果后续代码有改动(比如加了一个条件判断,可能跳过赋值步骤直接使用指针),提前初始化NULL就会避免指针变成野指针,让程序的行为更可控。
下面是完整的示例代码:
#include <stdio.h> int main(void) { // student structure struct student { char id[15]; char firstname[64]; char lastname[64]; float points; }; // student structure variable struct student std[3]; // student structure pointer variable struct student *ptr = NULL; // other variables int i; // assign std to ptr ptr = std; // get detail for user for (i = 0; i < 3; i++) { printf("Enter detail of student #%d\n", (i + 1)); printf("Enter ID: "); scanf("%s", ptr->id); printf("Enter first name: "); scanf("%s", ptr->firstname); printf("Enter last name: "); scanf("%s", ptr->lastname); printf("Enter Points: "); scanf("%f", &ptr->points); // update pointer to point at next element // of the array std ptr++; } // reset pointer back to the starting // address of std array ptr = std; for (i = 0; i < 3; i++) { printf("\nDetail of student #%d\n", (i + 1)); // display result via std variable printf("\nResult via std\n"); printf("ID: %s\n", std[i].id); printf("First Name: %s\n", std[i].firstname); printf("Last Name: %s\n", std[i].lastname); printf("Points: %f\n", std[i].points); // display result via ptr variable printf("\nResult via ptr\n"); printf("ID: %s\n", ptr->id); printf("First Name: %s\n", ptr->firstname); printf("Last Name: %s\n", ptr->lastname); printf("Points: %f\n", ptr->points); // update pointer to point at next element // of the array std ptr++; } return 0; }
内容的提问来源于stack exchange,提问作者DANAB
相关产品推荐
相关产品推荐

