【发布时间】:2021-01-05 16:10:23
【问题描述】:
我阅读了一些动态创建和使用二维数组的方法,我已经确定了这种方式:
文件:
5 4
+---+
|xxx|
|xxx|
+---+
main.c:
char** loadArray() {
FILE *in = fopen("file", "r");
int w, h;
fscanf(in, "%d %d\n", &w &h);
char (*buf)[w] = malloc(sizeof(char[h][w]));
for (int i = 0; i < h; i++) {
fscanf(in, "%s\n", buf[i]);
}
fclose();
return buf;
}
int main() {
char** array = loadArray();
for (int i = 0; i < 4; i++) { // magic number, only because I know the size
printf("%s\n", array[i]);
}
return 0;
}
虽然它会编译,但它会发出警告:incompatible pointer types returning 'char (*)[w]' from a function with result type 'char **',如果我尝试运行它会出现段错误。
几个问题(主要针对 C,但欢迎 C++ 特定答案以供将来参考,当我到达那里时):
- 多维数组的正确返回类型是什么?我认为该警告不是很有帮助,因为它提供了一个可变术语,我显然在阅读文件之前没有。
- 此时,我只是想让返回的二维数组正常工作,但当我这样做并继续前进时,我将需要数组的维度以便以后正确使用。我的第一个想法是返回结构,我可以在其中保存维度和数组本身。然而,经过进一步思考,可变大小让我认为我无法将单个结构模板用作函数的返回类型,我必须找到其他方法来获取数组的大小.是想法吗?
感谢您的宝贵时间。
【问题讨论】:
-
通常的答案:使用
std::vector。那是一个动态的对象数组,它知道自己的大小,其元素本身可以是vectors,等等。 -
C 和 C++ 在这类问题上非常不同。您的示例代码让我认为您只是在使用 C 构造?如果是这样,请删除 C++ 标签。
-
我明白了,感谢您对C++方面的建议,但我仍在寻找C解决方案。
-
malloc是否有足够的空间容纳C字符串?请记住,字符串末尾必须包含zero。 -
最后没有多余的空字节,我似乎做得很好,因为我只是想“代表 80x24 显示器的一部分”。不要乱搞字符串本身,我只需要能够打印出来。这真的是一个问题吗?我最初想一次扫描一个角色,但这对我来说听起来不是一个好主意。
标签: arrays c multidimensional-array