【问题标题】:How to use typedef struct如何使用 typedef 结构
【发布时间】:2018-05-19 12:52:48
【问题描述】:

我对 C 完全陌生,但在使用指针和 typedef struct 结构时遇到了问题。

我定义了两个typedef structs:StudentClass,我想知道这些是否是指针:

typedef struct _Class {
    char name;
    int grade;
} Class;

typedef struct _Student {
    int number;
    Class *classes;
} Student;

int main() {
    Student **students = (Student**) malloc(100 * sizeof(Student*));
    Student * studentOne;
    (*studentOne).number = 453;
}

这只是我程序的一部分,但我的问题是:为什么我们将数组 students 定义为双指针,而将 Student *studentOne 定义为指针,但在 _Studenttypedef 中我们有数组 @ 987654330@ 作为单指针数组。

所以在我的程序结构中Student 是一个指针,而结构Class 不是。为什么?

typedef struct的定义是一样的,那么什么时候用结构体作为指针呢?

感谢您的回答。

【问题讨论】:

  • 与您的问题无关,但所有以下划线开头并后跟大写字母的符号(例如_Class)都保留用于所有范围内的实现(编译器和标准库) .实际上,您可以为结构和类型别名使用相同的名称(例如 typedef struct Class { ... } Class;)。
  • 另请注意,您的示例代码存在很大缺陷,甚至无法编译。
  • typedef struct _Student { int number; Class *classes; }后面少了一个分号
  • Student 未由您显示的代码定义。
  • 为什么我们将数组students定义为双指针,而Student *studentOne定义为指针”这只有编写代码的人知道。

标签: c pointers struct typedef


【解决方案1】:

不,类型别名Class(和其他)是不是指针类型。它们只是例如的别名。 struct _Class.

所以而不是(例如)

Student * studentOne;

你可以写

struct _Student * studentOne;

如果您也有 _Student 结构的类型别名!

【讨论】:

    【解决方案2】:

    根据您的问题,在我看来您并不真正了解指针和内存分配,因此我将尝试简单地解释一下

    学生 * studentOne;

    可以表现为两件事:

    1. 指向学生的简单指针。当您想在堆上分配学生时使用此选项
    2. 一群学生。对于此选项,您可以执行以下操作:

      学生 * studentArr = (学生 *)malloc( NUM_OF_STUDENTS * sizeof(Student))

    如果您不希望学生坐在堆内,您只需创建一个简单的学生变量

    Student stud;
    

    如果你想在堆栈上创建一个学生数组,它应该像这样创建

    Student stud[NUM_OF_STUDENTS]
    

    对口

    Student ** studentMat;
    

    可以表现为两件事:

    1. 指向学生的指针数组
    2. 学生矩阵

    对于选项一,您可以这样做:

    Student ** studentPtrArr = (Student**)malloc(NUM_OF_STUDENTS * sizeof(Student*))
    for(int i=0; i < NUM_OF_STUDENTS; i++){
        Student[i] = (Student *)malloc(sizeof(Student))
    }
    

    对于选项二,你会这样做:

    Student ** studentPtrArr = (Student**)malloc(NUM_OF_STUDENT_ROWS * sizeof(Student*))
    for(int i=0; i < NUM_OF_STUDENTS; i++){
        Student[i] = (Student *)malloc(NUM_OF_STUDENT_COLUMNS sizeof(Student))
    }
    

    【讨论】:

    • 在 C 中,所有这些转换都是无用的。
    • 另外这个NUM_OF_STUDENTS * sizeof(Student)必须是NUM_OF_STUDENTS * sizeof(Student*)或者更好的Student ** studentPtrArr = malloc(NUM_OF_STUDENT_ROWS * sizeof *studentPtrArr)
    • 正如@alk 所写,如果您使用malloc 的“自我引用”表单,例如Stuff *ptr = malloc(N * sizeof *ptr),您将帮自己一个忙。无论ptr 的类型如何,每次都会获得正确的大小。
    猜你喜欢
    • 1970-01-01
    • 2021-11-06
    • 1970-01-01
    • 1970-01-01
    • 2023-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-28
    相关资源
    最近更新 更多