【发布时间】:2021-05-07 11:42:35
【问题描述】:
最近学习了 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++] = '\0';
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");
}
【问题讨论】:
-
你有一个无限循环。做
int c; while( ( c = getchar()) != EOF)。getchar返回一个整数。 -
@WilliamPursell 这不是无限的。当遇到
\n时它会中断。 -
@LukaSsS 如果用户在输入空格或换行符之前按下文件结束键会发生什么?还是使用输入重定向?还是管道?
-
@Someprogrammerdude 哦,现在我知道这可能是个问题了,谢谢,虽然这只是一个练习,以了解所有
alloc-s 的工作原理。
标签: c memory-management dynamic-memory-allocation