malloc和整数数组的realloc大小

时间:2015-06-01 04:01:57

标签: c arrays malloc

我希望能够在我的程序读取数字时重新分配空间量。 例如,当它运行时,它应该能够读取任意数量的整数,然后将它们打印出来作为< Int Array :(所有输入)' 这是我到目前为止所尝试的:

int main(int argc, char **argv)
{
    int i = 0, n, num;
    int *A;

    A = malloc(sizeof(A));

    while(scanf("%d",&num) == 1)
    {
        A[i] = num;
        i++;
    }

    n = sizeof(A)/sizeof(A[0]);

    printf("Int Array: ");
    for (i = 0; i < n; i++)
    {
        printf("%d ", A[i]);
    }

    return 0;
}

3 个答案:

答案 0 :(得分:4)

您的代码存在一些问题

  1. 语法int A*;无效,您的意思是int *A;
  2. 如果要分配一个元素,则正确的语法是

    A = malloc(sizeof(*A));
    
  3. 在这一行

    n = sizeof(A) / sizeof(A[0]);
    

    sizeof()运算符给出了poitner类型的大小,在这种情况下它与

    相同
    n = sizeof(void *) / sizeof(int);
    

    可以是21

  4. 您可以静态设置数组的大小,在这种情况下我建议避免使用malloc(),或者您可以询问用户,无论如何您无法从指针获取该大小,因此您必须存储它,例如

    if (scanf("%d", &size) != 1)
        return -1;
    
    A = malloc(size * sizeof(*A));
    if (A == NULL)
        return -1;
    /* proceed to work with `A' and keep `size' somewhere, you need it */
    free(A);
    

答案 1 :(得分:2)

您也可以先保留特定数量的内存,例如: 如果用户输入超过10个项目,则重新分配另一个20个整数的内存块,并将最后10个项目复制到新块中,依此类推。

fwrite(L->PAGES, sizeof(int), 1, arq);

答案 2 :(得分:0)

一个技巧是在每个新输入中重新分配内存。

 int indefiniteInput() {

    int num;
    int index = 0;
    int *inputs = malloc(sizeof (int));

    if (inputs == NULL) {
        perror("malloc failed!");
        return -1;
    }

    printf("Input numbers: ");

    while(scanf("%d", &num) == 1) {

        // stops getting inputs when -1 is entered, 
        // you can change it to any value you want
        if (num == -1)
            break;

        // reallocates memory for the input
        int *temp = realloc(inputs, sizeof (int) * (index + 1));

        if (temp == NULL) {
            free(inputs);
            perror("realloc failed!");
            return -1;
        }

        inputs = temp;  

        // adds the last input to reallocated memory
        inputs[index++] = num;
    }

    printf("Stored inputs: ");

    int i = 0;
    for (; i < index; i++)
        printf("%d ", inputs[i]);

    free(inputs);
    return 0;
}

输出:

Input numbers: 5 6 7 8 9 -1
Stored inputs: 5 6 7 8 9 -1

Input numbers: 1 2 3 5 -5 -6 89 256 2001 45600 96 33 369 -1
Stored inputs: 1 2 3 5 -5 -6 89 256 2001 45600 96 33 369