【问题标题】:A code for accessing each element of the structure array variable via pointer通过指针访问结构数组变量的每个元素的代码
【发布时间】:2023-02-05 00:33:56
【问题描述】:

在以下行中:

struct student *ptr = NULL;

为什么 ptr 设置为 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;
}

【问题讨论】:

  • 将该变量设置为 NULL 没有任何效果,因为它在几行之后被赋予了另一个值。这可能只是习惯性的整洁。

标签: c pointers null initialization declaration


【解决方案1】:

在发布的程序中,NULL 的初始化是可选的。您可以删除它,程序将完全等效。

  struct student *ptr = NULL;
  int i;
  ptr = std;

完全等同于

  struct student *ptr;
  int i;
  ptr = std;

还有

  struct student *ptr = std;
  int i;

初始化变量的原因是鲁棒性, 不正确。稳健性是指将更改程序时出错的风险降至最低。

假设您修改了程序,不小心删除了行ptr = std;。由于对 NULL 的初始化,ptr 在 for 循环内使用时将是一个空指针。如果您的程序崩溃或出现其他异常,您可以在禁用优化的情况下编译它并在调试器中运行它。然后您会可靠地看到它在尝试取消引用空指针时崩溃,这将清楚地表明 ptr 设置不正确。如果 ptr 未初始化,则行为可能是任何行为,具体取决于此时内存中发生的情况,并且从一次执行到下一次执行可能无法重现,因此将更难找到错误。

在此示例中,没有充分的理由更喜欢初始化为 NULL 而不是直接设置 ptr = std。由于不同的原因,两者都可以被认为是良好的卫生习惯。将所有指针初始化为 null 很好,因为它是一个简单的规则,并且它将无聊的初始化(您不需要过多关注)与有趣的计算分开。另一方面,直接将 ptr 初始化为它需要的值是很好的,因为它最大限度地减少了发生的事情的数量。

【讨论】:

    【解决方案2】:

    这个指针的初始化由NULL

    // student structure pointer variable
    struct student *ptr = NULL;
    

    是多余的。

    您可以在其声明中通过结构数组的第一个元素对其进行初始化,例如

    // student structure pointer variable
    struct student *ptr = std;
    

    代码的作者通过NULL初始化了指针,因为他不想声明一个未初始化的指针并且程序内的指针至少被重新赋值了两次。

    所以他似乎想把指针的声明分开,并用std赋值给它。

    此外,由于指针仅在 for 循环中使用,因此最好在 for 循环语句中声明它,例如

      for ( struct student *ptr = std; ptr != std + 3; ++ptr ) {
        printf("Enter detail of student #%d
    ", (i + 1));
        printf("Enter ID: ");
        scanf("%14s", ptr->id);
        printf("Enter first name: ");
        scanf("%63s", ptr->firstname);
        printf("Enter last name: ");
        scanf("%63s", ptr->lastname);
        printf("Enter Points: ");
        scanf("%f", &ptr->points);
      }
    

    注意它比scanf这些调用更安全

    scanf("%s", ptr->id);
    scanf("%s", ptr->firstname);
    scanf("%s", ptr->lastname);
    

    来写

    scanf("%14s", ptr->id);
    scanf("%63s", ptr->firstname);
    scanf("%63s", ptr->lastname);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-11
      • 1970-01-01
      • 2013-05-26
      • 1970-01-01
      • 1970-01-01
      • 2014-02-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多