指向结构的动态数组指针

Moe*_*ani 5 c arrays pointers

我必须使用以下代码块进行学校作业,严格禁止任何修改.

typedef struct 
{
    char* firstName;
    char* lastName;
    int id;
    float mark;
}* pStudentRecord;

pStudentRecord* g_ppRecords;
int g_numRecords =0;
Run Code Online (Sandbox Code Playgroud)

这里g_ppRecords应该是一个指向结构的指针数组.什么我完全不理解的是,说明如何能pStudentRecords *g_ppRecords;意味着g_ppRecords是一个数组,因为数组应该被定义为

type arrayname[size];
Run Code Online (Sandbox Code Playgroud)

我尝试动态地为g_ppRecords分配内存,但这没有帮助.

g_ppRecords = (pStudentRecord*) malloc(sizeof(pStudentRecord*)*(g_numRecords+1));
Run Code Online (Sandbox Code Playgroud)

nne*_*neo 2

观察它的pStudentRecord类型定义为指向结构的指针。C 中的指针只是指向内存块的开头,无论该块包含 1 个元素(普通“标量”指针)还是 10 个元素(“数组”指针)。所以,例如,下面的

char c = 'x';
char *pc = &c;
Run Code Online (Sandbox Code Playgroud)

指向pc以字符 开头的一段内存'x',而以下内容

char *s = "abcd";
Run Code Online (Sandbox Code Playgroud)

指向以(后跟空字节)s开头的一段内存。"abcd"类型相同,但它们可能用于不同的目的。

g_ppRecords因此,一旦分配,我可以通过执行例如访问元素g_ppRecords[1]->firstName

现在,要分配这个数组:您要使用g_ppRecords = malloc(sizeof(pStudentRecord)*(g_numRecords+1));(尽管请注意sizeof(pStudentRecord*)sizeof(pStudentRecord)是相等的,因为两者都是指针类型)。这会产生一个未初始化的结构指针数组。对于数组中的每个结构指针,您需要通过分配一个新结构来为其赋予一个值。问题的关键是如何分配单个结构,即

g_ppRecords[1] = malloc(/* what goes here? */);
Run Code Online (Sandbox Code Playgroud)

幸运的是,您实际上可以在以下位置取消引用指针sizeof

g_ppRecords[1] = malloc(sizeof(*g_ppRecords[1]));
Run Code Online (Sandbox Code Playgroud)

请注意,这sizeof是一个编译器构造。即使g_ppRecords[1]不是有效的指针,该类型仍然有效,因此编译器将计算正确的大小。