我该怎么做才能导致重新分配停止工作?

时间:2019-11-14 14:58:58

标签: c malloc realloc

用于作业。做好旧的银行应用程序。我正在尝试使用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;
}

Output

我在较早的草案中曾发布过类似的问题,但事实证明不是参数问题

1 个答案:

答案 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*/
}