【发布时间】:2018-01-09 08:21:08
【问题描述】:
我有这个功能,我重新分配内存,但是当我想读取字符串时它不起作用=>错误 Student 是一个结构体
void insertStudent(Student **myStudents, int *size)
{
int newSize = *size + 1;
*myStudents = (Student*)realloc(myStudents, newSize*sizeof(Student));
printf("Enter your grade: ");
scanf("%f", &(*myStudents)[*size - 1].nota);
printf("Enter your first name: ");
scanf("%s", &(*myStudents)[newSize-1].firstName);
printf("Enter your second name: ");
scanf("%s", &(*myStudents)[*size - 1].lastName);
//Generate a new code
/*int code = rand() % 1+1000;
int ok = 0;
while (ok == 0)
{
ok = 1;
for (int i = 0; i < *size; i++)
if ((*myStudents)[i].cod == code)
{
code = rand() % 1 + 1000;
ok = 0;
}
}*/
(*myStudents)[*size-1].cod = 7;
printf("Your code is: %d. Do not forget it! ", 7);
}
【问题讨论】:
-
能否在问题中添加编译器错误?
-
您需要确定
*size - 1和newSize - 1中的哪一个是正确的,并始终如一地使用它。我认为是第二个,但仔细看。 -
旁注:
realloc()可能会失败。在这种情况下,它会返回NULL,并且旧指针仍然有效。由于您需要free()old 指针,因此基本上是内存泄漏等待发生将realloc()的返回值分配给您作为参数传递的同一指针。 -
正如其他人将(或已经)指出的那样:在编写普通的旧 C 时,请不要转换
mailloc、realloc和calloc的返回值。在 C++ 中需要转换,但在 C 中被认为是不好的做法,因为它可以隐藏错误(尤其是 C11 之前) -
@EliasVanOotegem nitpick:隐式函数声明在 C99 中已经错误(需要诊断),使得“规范”参数有点弱。尽管如此,我仍然认为casting to/from
void *is bad practice。