我正在尝试编写一个函数,将一组数据(名字,姓氏,分数)添加到3个不同的动态数组中(第一个名称为一个2d char数组,最后一个名称为一个2d char数组) ,以及得分的浮点数组合。到目前为止,这是我的代码:
void add(char **firstname, char **lastname,char *newfirst,char *newlast,float newscore, float *score, int *num)
{
realloc(firstname, sizeof(newfirst));
realloc(lastname, sizeof(newlast));
realloc(score, sizeof(float)*sizeof(newscore));
*num = *num + 1;
firstname[*num] = newfirst;
lastname[*num] = newlast;
score[*num] = newscore;
}
我知道我需要重新分配内存才能向数组中添加任何内容。我试图将1添加到num,这样每当我运行其他函数(如打印和排序等)时,它将运行在这些函数中的其他循环适当的次数。程序的所有其他方面都可以工作,当我通过这个函数运行它时它就崩溃了。我是否正确分配内存,以及可能导致崩溃的原因?
以下是主要情况,如果有人需要查看它:
case 2: printf("Enter record of student to add: \n");
printf("Enter the first name: \n");
scanf_s("%s", addfirst, 21);
printf("Enter the last name: \n");
scanf_s("%s", addlast, 21);
printf("Enter the score:\n");
scanf_s("%f", addscore);
add(firstname, lastname, addfirst, addlast, addscore, score, num);
break;
我99%确定我已正确初始化了此函数使用的所有变量。
答案 0 :(得分:1)
您未正确使用realloc
。您必须接受realloc
的变量返回值,该变量与用作第一个参数的变量不同,因为realloc
可能会返回NULL
。如果它不是NULL
,您可以将其分配给原始变量;但如果它是NULL
,你仍然有一个指向前一个内存的指针(避免内存泄漏)。
您的代码还有其他问题。
sizeof
不返回字符串的长度,而是返回变量引用的对象的大小,在这种情况下它是指针,因此它将返回4或8.使用{ {1}}而不是。
您正在使用strlen
和firstname
,就好像他们是本地变量一样。当函数返回时,分配给它们的值将消失。您需要传入三重指针并在使用时取消引用它们。
您正在尝试为字符串重新分配空间,但您还没有尝试为数组中的另一个指针重新分配任何空间以实际指向新的字符串内存。
您无法使用简单的赋值语句复制字符串;改为使用strcpy。
你也没有正确传递变量。如果他们(可能)接收新值,则需要传递地址,而不是值。
所以,看起来你正试图这样做:
lastname
请注意,只重新分配指针数组。字符串内存只是malloced。
每次重新分配单个元素效率非常低。通常,您一次只能重新分配一大块元素。这样的数组最好表示为结构,以便其当前分配的空间和当前占用的空间可以与数据一起保存。
答案 1 :(得分:0)
realloc
的使用不正确:
realloc(firstname, sizeof(newfirst));
问题是realloc
返回一个地址,该地址可能与原始地址不同,必须将其分配回重新分配的指针或另一个指针(第二种情况很少见)。
问题是当realloc
分配不同的块时,它也会释放firstname
。最终结果是您的firstname
指针指向一个已释放的块,而重新分配的块则成为内存泄漏。
此外,您正在计算不正确重新分配的大小:sizeof
为您提供指针的大小,同时您正在寻找字符串的长度。
最后,firstname
是指向字符指针的指针(这是可以理解的,因为你想修改caler中的指针)。您需要在分配时取消引用它。
以下是解决这些问题的方法:
*firstname = realloc(*firstname, strlen(newfirst)+1);