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

What am I doing wrong with realloc() in c?

请问,内存管理我做错了什么。我只想从 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;
}

重新分配成功后删除空闲。 Realloc 会为你处理这些。此外,如果您遇到错误情况,您将双倍 free() 您的缓冲区。

关于:free(tmp);

此语句不应出现在发布的代码中。

它释放刚刚分配的内存

==== 指针 'n' 最好指向调用者中已分配的数组,而不是某个固定数组

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

==== 变量(和参数)名称应指示 usagecontent(或更好,两者) 即使在当前上下文中,参数名称 'n' 和 'l' 也无意义