我必须使用以下代码块进行学校作业,严格禁止任何修改.
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)
观察它的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]不是有效的指针,该类型仍然有效,因此编译器将计算正确的大小。
| 归档时间: |
|
| 查看次数: |
8185 次 |
| 最近记录: |