我在c中使用realloc()做错了什么?

时间:2017-12-08 01:43:08

标签: c memory memory-management realloc

我想问一下,我在内存管理上做错了什么。我只是想从stdin读取一些int数组然后打印它。从2个元素开始,然后将2分配给金额我将满意。

#include <stdio.h>
#include <stdlib.h>

void read (int * array, int * n, int * l) {
    int * tmp;
    printf("Enter values:\n");
    for (*l = 0; *l < *n; (*l)++) {
        if (*l == *n - 1) {
            (*n) *= 2;
            tmp = (int*) realloc (array, sizeof(int) * (*n));
            if (tmp != NULL) {
                array = tmp;
                free(tmp);
            }
            else {
                printf("Error!\n");
                free(tmp);
        }
        if (scanf("%d", &array[*l]) != 1) break;
    }
}

void print (int * array, int length) {
    int i;
    printf("Your values:\n");
    for (i = 0; i < length; i++) printf("%d ", array[i]);
}

int main (void) {
    int n = 2; /* number of array elements */
    int length = 0; 
    int * array = (int *) malloc(sizeof(int) * n);

    read(array, &n, &length);
    print(array, length);
    free(array);
    return 0;
}

2 个答案:

答案 0 :(得分:1)

关于:free(tmp);

此声明不应位于已发布代码中的任何位置。

释放刚刚分配的内存

==== 指针&#39; n&#39;最好是指向一个数组,在调用者中,分配而不是某些固定数组

==== 当传递一个指针,其中被调用的函数将改变指针所指向的位置时,它必须作为int **n传递(在当前场景中)。这也意味着调用函数必须传递指针的地址,而不是指针的内容

==== 变量(和参数)名称应指明usagecontent(或更好,两者)参数名称&#39; n&#39;和&#39; l&#39;即使在当前的背景下也毫无意义

答案 1 :(得分:0)

成功重新分配后删除免费。 Realloc会为您解决这个问题。此外,如果您遇到错误情况,您将加倍()缓冲区。