简单动态内存分配的问题

Problems with simple dynamic memory allocation

最近了解了 C 中的动态内存分配,并试图编写一个简单的程序来读取一堆单词,将它们存储在动态数组中,然后以相反的顺序打印单词,但我在执行。请不要对我太苛刻,我只是在学习,任何帮助将不胜感激!

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

int main()
{
    char **arr = (char **)malloc(1 * sizeof(char *));
    int maxarr = 1, arrsz = 0;
    for (;;)
    {
        if (arrsz >= maxarr)
        {
            maxarr *= 2;
            arr = (char **)realloc(arr, maxarr * sizeof(char *));
            if (!arr)
                return -1;
        }
        arr[arrsz] = (char *)malloc(1 * sizeof(char));
        int i = arrsz++;
        int sz = 0, mx = 1;
        char ch = getchar();
        while (ch != ' ' && ch != '\n')
        {
            if (sz >= mx)
            {
                mx *= 2;
                arr[i] = (char *)realloc(arr[i], mx * sizeof(char));
                if (!arr[i])
                    return -1;
            }
            arr[i][sz++] = ch;
            ch = getchar();
        }
        if (sz >= mx)
        {
            mx++;
            arr[i] = (char *)realloc(arr[i], mx * sizeof(char));
            if (!arr[i])
                return -1;
        }
        arr[i][sz++] = '[=10=]';
        if (ch == '\n')
            break;
    }

    for (int i = arrsz - 1; i >= 0; i--)
    {
        if (arr[i] != NULL)
            printf("%s ", arr[i]);
    }

    for (int i = 0; i < maxarr; i++)
        free(arr[i]);
    free(arr);
    printf("\n");
}
    for (int i = 0; i < maxarr; i++)
        free(arr[i]);

这很糟糕,因为从 arr[arrsz]arr[maxarr-1] 的元素未初始化。使用通过 malloc() 分配且未初始化的缓冲区值会调用 未定义的行为

应该是:

    for (int i = 0; i < arrsz; i++)
        free(arr[i]);

我的两分钱:

您应该始终检查您的 malloc 调用是否成功。不仅用于 realloc 个调用。

之后:

char **arr = (char **)malloc(1 * sizeof(char *));

您应该添加:

if (!arr) return -1;

还有一点,对于潜在的 realloc 失败,请尽量让堆处于相对良好的状态。不要直接 returning,你应该尝试清理 arr 之前,因为它是本地的并且只在你的函数中使用。我建议你添加一个自定义的 realloc 函数,它会在失败的情况下进行清理,然后你的主函数可以在失败的情况下直接 return -1。