我已经制作了一个库程序来存储电影并为我的结构数组使用动态内存分配,但没有成功。添加第一个记录(电影)工作正常,但在第二个记录之后,值只是混乱的字符。
除了显示我的代码之外,没有什么可说的了。
问题是我无法在我的函数addmovie();
内realloc
但是如果我把这行:
movie = (struct movies *) realloc(movie, (records+1) * sizeof(struct movies));
在调用addmovie();
函数之前,它似乎可以工作,为什么?
/* Global variables */
int records = 0; // Number of records
struct movies{
char name[40];
int id;
};
addmovie(struct movies **movie)
{
int done = 1;
char again;
int index;
while (done)
{
index = records;
records++; // Increment total of records
struct movies *tmp = (struct movies *) realloc(movie, (records+1) * sizeof(struct movies));
if (tmp)
*movie = tmp;
system("cls");
fflush(stdin);
printf("Enter name of the Movie: ");
fgets(movie[index].name, 40, stdin);
fflush(stdin);
printf("Enter itemnumber of the Movie: ");
scanf("%d", &movie[index].id);
printf("nSuccessfully added Movie record!n");
printf("nDo you want to add another Movie? (Y/N) ");
do
{
again = getch();
} while ( (again != 'y') && (again != 'n') );
switch ( again )
{
case ('y'):
break;
case ('n'):
done = 0;
break;
}
} // While
}
int main()
{
int choice;
struct movies *movie;
movie = (struct movies *) malloc(sizeof(struct movies)); // Dynamic memory, 68byte which is size of struct
while (done)
{
system("cls");
fflush(stdin);
choice = menu(); //returns value from menu
switch (choice)
{
case 1:
addmovie(movie);
break;
}
} // While
free(movie); // Free allocated memory
return 0;
}
C 是一种按值传递语言。 当您执行以下操作时:
movie = (struct movies *) realloc(movie, (records+1) * sizeof(struct movies));
在您的函数中,来自main()
movie
根本不受影响。 您需要传递指向指针的指针:
void addmovie(struct movies **movie)
,然后修改指针的内容:
struct movies *tmp = realloc(...)
if (tmp)
*movies = tmp;
请注意,同样重要的是不要将realloc
的返回值赋回变量以传递给它 - 您最终可能会泄漏。
查看 comp.lang.c FAQ 问题 4.8 以获得完整的解释。