已关闭,此问题需要更focused。目前不接受答复。
**想改善这个问题吗?**更新问题,使其仅通过editing this post关注一个问题。
昨天关门了。
Improve this question
#include <stdio.h>
#include <stdlib.h>
int main(){
char **lab;
char c;
int x,y,i=0,j=0,columnnumber=0,rownumber=1,check=1;
scanf("%d %d",&x,&y);
lab = (char**)malloc(sizeof(char*)*rownumber);
lab[0] = (char*)malloc(sizeof(char)*1000);
while(check){
scanf("%c",&c);
if(c=='\n'){
check = 0;
}
else{
lab[0][columnnumber] = c;
columnnumber++;
}
}
lab[0] = realloc(lab[0],(columnnumber+1)*sizeof(char));
rownumber = 2;
lab = (char**)realloc(lab,rownumber*sizeof(char*));
lab[1] = (char*)malloc(sizeof(char)*(columnnumber+1));
check = 1;
while(check){
scanf("%c",&c);
if(c=='\n'){
rownumber++;
lab = realloc(lab,rownumber*sizeof(char*));
lab[rownumber-1] = (char*)malloc(sizeof(char)*(columnnumber+1));
j = 0;
}
else if(c == EOF){
check = 0;
}
else{
lab[rownumber-1][j] = c;
j++;
}
}
}
迷宫(每行末尾有'\n',末尾有EOF):
XXXXXXXXXXXXXXXXXXXXX XXXX
X XXXX X XX XXXX
X X XXXXXX XX XX
X XXXXXX XXXXXXXXX XX XX
X XX XXXX X XX X XX
X XX X XXX XX XXXXX XX XX
X X XX X X XX
X X XXX XXX XXXXXX XXXXX
X XX XX X XX XX XX
X XX XXXX X X XX XX XX
X XX XX XX XXX XX XX
X XX X XXX XX X XX
X XX XXX XXXXXXXXX XX
X XXXX XX XXXX
XXXXXXXXXXXXXXXXXXXXXXXXXX
我应该接受输入,我们称之为迷宫,并将迷宫信息存储在一个2D指针数组中,正如我在标题中所说的。我该怎么做?我是动态分配和C编程的新手。行计数和列计数可以变化,只要不超过100k个单元格即可。
每行末尾有'\n',末尾有EOF(迷宫在上面)。
2条答案
按热度按时间aurhwmvo1#
如果迷宫的尺寸事先不知道,那么也不知道行指针的数组必须有多大。
在您的问题中,您指出单元格的最大数量为100,000。这意味着最大行数为100,000(一列)。因此,行指针数组的最大大小是100,000个指针。虽然您可以从一个较小的值开始并使数组增长,但从一开始就将数组设置为这个大小会更简单。
但是,100,000个指针的数组大小为400或800 KiB,具体取决于平台。虽然在大多数非嵌入式平台上获得这样的内存量不是问题,但在大多数平台上堆栈空间(由本地数组使用)是有限的。例如,在Windows上,默认的最大堆栈大小约为1 MiB。因此,最好在堆上分配内存(使用
malloc
),而不是在堆栈上分配内存(使用本地数组),如下所示:我们在阅读第一行时也有类似的问题,因为我们不知道该行的列数。由于您声明单元格的最大数量为100,000,这意味着最大列数为100,000(如果迷宫只有一行)。因此,为了阅读第一行,我们需要一个
char
类型的100,000个元素的数组。由于上述原因,这个数组也应该在堆上而不是在堆栈上分配,所以我们应该再次使用malloc
。一旦我们通过阅读第一行确定了列数,我们就可以使用realloc
将数组缩小到所需的大小。此外,对于所有进一步的行,我们知道列数不会改变,所以从现在开始,我们总是知道数组中每行所需的元素数。这意味着我们不再需要为一行分配100,000个元素,然后在以后收缩它;我们现在可以从一开始就分配所需数量的元素。下面是一个例子:
使用问题中指定的输入,此程序具有以下输出:
iugsix8n2#
或者,由于您已经在进行重新分配,因此不妨将此操作简化为将未知长度的文件读取到一个动态字节数组中(使用
fread
)。如果您不担心将其解析为行,这会非常简单(并且更快)。然后,当输入全部完成时,可以验证附加约束,诸如最大线或线是相同长度。这线性化和简化了双指针,并在一个内存块内工作。