【问题标题】:2d array where dimensions are not known until runtime直到运行时才知道维度的二维数组
【发布时间】:2014-08-11 22:18:01
【问题描述】:

我正在编写一个函数,它读取文件并将字符存储在二维数组中。我希望这是一个全局变量,因为我希望 main 方法之外的多个函数能够访问它,但是在我读取文件之后才能设置尺寸,那么这样做的方法是什么。在提出这个问题之前,我已经阅读了一些关于堆栈溢出的帖子,但我仍然感到困惑/这些问题对我解决这个特定问题没有帮助。

(我仅限于使用 ANSI c 提供的库/函数)

【问题讨论】:

  • 一种选择是将实现隐藏在接口后面,例如提供用于检查数组大小和访问特定元素的内联函数
  • 你能澄清一下你是指C89吗? (C99 和 C11 由 ANSI 批准,但有时人们说“ANSI C”仅表示 C89)

标签: c multidimensional-array


【解决方案1】:

你想使用malloc:

int i;
t_data * rows;
t_data ** array;

// Allocate the 2d array as a dynamic 1d array of pointers to rows
array = malloc(sizeof(t_data *) * num_rows);

// Allocate each row as a dynamic 1d array of t_data
for ( i = 0; i < num_rows; i++ )
    array[i] = malloc(sizeof(t_data) * num_cols);

这里,t_data 是您要存储的数据的数据类型(对于每个数组元素),num_rows 是读取的行数,num_cols 是读取的列数。

您可以通过array[i][j]访问元素。

当你完成了数组,你“反向”释放它:

for ( i = 0; i < num_rows; i++ )
    free(array[i]);

free(array);

【讨论】:

  • 我想这就是我要找的东西!
【解决方案2】:

任何需要在 C 中“动态”调整大小的东西都需要使用指针、malloc()free() 和相关工具。在线搜索(或在书中,如果有的话)搜索动态内存分配。

请注意,尽管这是一个相当广泛的主题(具有相关的学习曲线和陷阱),因此如果您返回一些您已实现的代码,我们可以更好地帮助解决任何直接相关的问题。

【讨论】:

  • 准确地说,C99 允许使用 VLA(可变长度数组),因此声明 “在 C 中需要'动态'大小的任何东西都需要使用指针”严格来说并不正确。
  • VLA 只能在块范围内使用,但 OP 请求全局变量
  • @Matt McNabb:是的,我正要修改我的评论:P
  • 另外,用户提到了ANSI C?
  • 所有版本的 ISO C 也被 ANSI 批准
【解决方案3】:

您需要一个指针类型,例如 uchar*。然后在运行时,当您知道尺寸 m x n 时,您需要使用 malloc,例如:

uchar *matrix = (uchar*)malloc(m * n * sizeof(uchar))

然后要导航它,您将使用一个考虑步幅的函数:

int stride = m;
// for element (i,j)
matrix[i * stride + j];

【讨论】:

    猜你喜欢
    • 2013-12-11
    • 2011-08-18
    • 2010-09-30
    • 2012-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-26
    • 1970-01-01
    相关资源
    最近更新 更多