我正在编写一个程序,用于使用结构作为决赛的练习将学生的成绩按阵列排列。我需要创建一个函数来检查数组中是否还有剩余位置,如果没有,数组需要加倍,然后将坡度添加到下一个可用位置。如果数组有空缺职位,则应将等级值添加到下一个可用职位。每当对数组进行更改时,必须使用正确的值更新grades_array_pos和grades_array_size。我对C来说还很陌生,因此我很难全神贯注于如何执行此操作。所有这些都必须仅使用基本变量,for和while循环并以非常基本的方式完成。
::
答案 0 :(得分:3)
这是每个人都需要掌握的一项关键但简单的技能。基本方法是使变量保持当前分配的元素数量以及与所使用数量相反的计数器。然后循环填充数组。在循环的开始处,检查是否if (used == allocated)
以确定是否需要重新分配。
如果需要重新分配,请使用TEMPORARY指针,调用realloc
,并将分配的元素数量加倍。验证realloc
是否成功,否则,请中断填充数组的循环(不要退出程序),因为在尝试realloc
之前,指向数组的原始指针仍指向有效数据。 / p>
如果realloc
成功地将新大小的内存块分配给您的原始指针,请使用新分配的元素计数来更新变量-继续操作,并根据需要重复。示例:
#define NSTRUCT 8 /* initial number of struct to allocate for array */
...
size_t allocated = NSTRUCT, /* holds current number of elements allocated */
used = 0; /* holds current number used/filled */
struct student_grades *grades = malloc (allocated * sizeof *grades);
if (!grades) {
perror ("malloc-grades");
return 1;
}
while (/* loop to fill struct array */) {
if (used == allocated) { /* check if realloc needed */
/* always realloc using a TEMPORARY pointer */
void *tmp = realloc (grades, 2 * allocated * sizeof *grades);
if (!tmp) { /* validate reallocation */
perror ("realloc-grades");
break; /* don't exit, original pointer still good */
}
grades = tmp; /* assign reallocated block to grades */
allocated *= 2; /* update allocated size */
}
/* fill next element -- keep going.... */
used++;
}
仔细研究一下,如果您还有问题,请告诉我。