MST
星途 面试题库

面试题:C语言结构体数组内存分配问题

假设有如下结构体定义:struct student { char name[20]; int age; }; 现在要创建一个包含10个该结构体元素的数组,描述如何正确分配内存,并说明在分配内存过程中可能遇到的错误及如何避免。
15.5万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试
  1. 正确分配内存
    • 静态分配
      struct student students[10];
      
      在栈上静态分配一个包含10个struct student结构体元素的数组。这种方式简单直接,适合在函数内部使用,并且数组的生命周期与函数相同。
    • 动态分配
      struct student *students = (struct student *)malloc(10 * sizeof(struct student));
      if (students == NULL) {
          // 处理内存分配失败
          perror("malloc");
          return -1;
      }
      
      使用malloc函数在堆上动态分配内存,malloc函数返回一个指向分配内存起始地址的指针,需要强制类型转换为struct student *类型。分配成功后返回的指针指向一个连续的内存区域,足够存储10个struct student结构体。使用完动态分配的内存后,要记得释放:
      free(students);
      students = NULL;
      
  2. 可能遇到的错误及避免方法
    • 内存分配失败
      • 错误描述malloc函数可能因为系统内存不足等原因无法分配所需大小的内存,此时会返回NULL。如果程序继续使用这个NULL指针,会导致未定义行为,例如段错误。
      • 避免方法:在调用malloc后,立即检查返回值是否为NULL。如上述动态分配代码中,当students == NULL时,使用perror输出错误信息并做相应处理,如返回错误码或结束程序。
    • 内存泄漏
      • 错误描述:如果动态分配的内存没有被释放(例如在程序中有多个return语句,部分分支没有释放内存),就会造成内存泄漏,随着程序运行,系统可用内存会逐渐减少。
      • 避免方法:确保在不再需要动态分配的内存时,及时调用free函数释放内存。并且在释放后,将指针设置为NULL,防止出现野指针(指向已释放内存的指针)。如上述代码中,释放内存后将students设置为NULL
    • 内存越界
      • 错误描述:无论是静态还是动态分配的数组,如果访问数组元素时索引超出范围(例如students[10],数组合法索引是09),就会导致未定义行为,可能破坏其他数据或者导致程序崩溃。
      • 避免方法:在访问数组元素时,确保索引值在合法范围内。在对数组进行循环操作时,要仔细检查循环条件,避免出现索引越界的情况。