用于作业。做好旧的银行应用程序。我正在尝试使用malloc和realloc创建一个动态数组,因此它为我创建的每个帐户提供了1个更多的空间。它只是一个测试,所以根本不完整。 当我运行它时,它会要求我输入我的名字,姓氏和年龄,然后在第二遍时,它会跳过名字而直接转到第二个名字。由于重新分配无法正常工作。我什至注释掉了realloc语句,结果是一样的。我以为也许是因为我没有输入char数组中允许的全部15个字符,所以编译器看到了一些内存,数字不足以容纳2 x 15元素数组,而是一个年龄加上一个3元素数组。与int scanf相同的结果(注释掉)。但这并不能解释为什么如果realloc没有创建一个索引,我为什么可以索引1。不能进行调试,GDB总是说Dwarf Error:Eclipse编译单元标头中的版本错误(为4,应为2)。
struct account{
char firstName[15];
char lastName[15];
char age[3];
};
void assign(struct account* test, int count){
printf("enter first name \n");
fgets(test->firstName, 15, stdin);
printf("enter lastName\n");
fgets(test->lastName, 15, stdin);
printf("enter age\n");
//scanf("%d", &test->age);
fgets(test->age, 3, stdin);
}
int main(void){
struct account * test = (struct account*)malloc(sizeof(struct account));
int count = 0;
assign(&test[count], count);
count++;
test = realloc(test, (sizeof(struct account) + count + 2));
assign(&test[count], count);
count++;
printf("%s\n", test[0].firstName);
printf("%s\n", test[0].lastName);
printf("%s\n", test[0].age);
printf("%s\n", test[1].firstName);
printf("%s\n", test[1].lastName);
printf("%s\n", test[1].age);
while(1);
return 0;
}
我在较早的草案中曾发布过类似的问题,但事实证明不是参数问题
答案 0 :(得分:0)
查看realloc的手册页:
realloc()函数更改所指向的内存块的大小 至 通过ptr调整字节大小。内容在以下范围内将保持不变 区域的开始,直到新旧大小的最小值。如果 新的大小大于旧的大小,添加的内存将不会 初始化。如果ptr为NULL,则该调用等效于mal‐ loc(size),用于所有size值;如果size等于零,并且ptr为 不为NULL,则该调用等效于free(ptr)。除非ptr是 NULL,它必须已由较早的对malloc()的调用(cal- loc()或realloc()。如果指向的区域已移动,则free(ptr)为 完成。
很明显,重新分配第二个参数的期望字节不是整数值。
此语句:test = realloc(test, (sizeof(struct account) + count + 2));
不合逻辑,因为count
并非精确计算的字节值。
您要做的是清楚地分配更多空间。因此,您可以执行以下操作:test = realloc(test, sizeof(struct account) * 2);
同样,一次又一次地调用realloc是不好的,就像在代码上那样。您可以设置更大的容量,例如 20 ,并具有以下结构:
if(count == capacity){
test = realloc(test, sizeof(struct account) * 2);
capacity = capacity * 2;
}
else{
++count;
/*keep adding*/
}