简单动态内存分配的问题
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。
最近了解了 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。