You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何要将结构体指针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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 16:55:22