【发布时间】:2019-11-20 22:46:04
【问题描述】:
我正在编写代码,用户输入 Minesweeper 的字段,其中'.' 是空字段,'*' 是炸弹。程序将从输入中读取字段的大小,并打印整个游戏字段,其中 '.' 字段被该字段周围的炸弹数量替换,如果该字段没有任何内容,则打印'.',如果该字段为'*',则仅打印'*'。
我们不知道输入(游戏领域)会有多大。 输入以 EOF 结束。我的程序适用于“正常”(小)输入,例如 10x10 游戏场、50x50 游戏场、20x4 游戏场等。我将输入输入到 arr,然后将每个索引复制到 arr2,这样我就可以获得另一个输入arr 并且我不会丢失以前的输入。 两个数组都是一维的。在 arr2 中,如果炸弹 (' * ') 在它周围,我将索引值从 '.' 更改为数字(即 2)。
输入示例:
.*.
*.*
输出示例:
2*2
*3*
但是,当我尝试输入具有 216 行和 10 列 (216x10) 的游戏字段时,会发生以下情况:
- 如果代码和你看到的一样,程序会说:
realloc(): invalid next size. Aborted (core dumped) - 如果我在 realloc 中使用 &arr2,它的含义是一样的。
- 如果我 删除 realloc 行,它会显示:
munmap_chunk(): invalid pointer. Aborted (core dumped) - 带有数字的打印游戏字段具有“正确打印的字段”以及出现换行符或整行填充数字的部分。
Valgrind 表示没有内存泄漏或低输入错误。
由于我是内存管理和指针的新手,我无法找出问题所在。 如果您提出问题并尝试帮助我,我将不胜感激。
我在这里展示的代码应该是有问题的部分(并且是程序的开头)。其余代码应该没问题,并且基于这部分工作。
int main()
{
int err, size=200;
char *arr=NULL;
char *arr2=(char*)malloc(sizeof(char)*size);
size_t bufsize=0;
printf("Enter game field:\n");
while(true)
{
for (int i=0;i<size;i++)
{
err=getline(&arr,&bufsize,stdin);
if (i==(size-2))
{
size *= 3;
arr2=(char*)realloc(arr2,sizeof(char)*size);
}
for (int j=0;j<(err-1);j++)
{
arr2[l]=arr[j];
l++;
}
/*rest of the code*/
}
}
.
.
.
【问题讨论】:
-
关于:
char *arr2=(char*)malloc(sizeof(char)*size);这有几个问题。建议不要详细说明:char *arr2 = NULL; char *temp = realloc( arr2, size );,然后是:if( ! arr2 ) { perror( "calloc for arr2 failed" ); exit( EXIT_FAILURE ); } else { arr2 = temp;} -
变量
l在哪里初始化? -
通过
getline()读入的行内容的预期是什么?该行内容的验证在哪里?
标签: c arrays pointers malloc realloc