【问题标题】:Declare matrix at file scope, dimensions from user input? C在文件范围内声明矩阵,来自用户输入的维度? C
【发布时间】:2016-04-20 15:31:54
【问题描述】:

我有一个基于矩阵的程序,需要各种函数才能访问这个矩阵及其维度,我从用户那里得到。我设法通过将它们作为参数传递给每个单独的函数来做到这一点,但这似乎效率不高。

当我尝试声明时:

int lin, col;
char matrix[lin][col]; 

我收到一个错误:文件范围内不允许可变长度数组声明。我猜是因为那时我还没有向用户询问“lin”和“col”?我的问题是:有没有办法让我的可变维度矩阵具有全局范围?或者一种无需将它们作为参数传递给各种函数即可访问此矩阵和维度的方法?

【问题讨论】:

  • 为什么不能在动态内存分配中使用指针?
  • 如果你不能使用动态分配,就放比需要更大的值。
  • 我还没有了解动态内存分配。 :) 既然这里提到了,我用谷歌搜索并弄清楚它是什么意思。

标签: c matrix global-variables global-scope


【解决方案1】:

char **matrix;

读取行 r 和列 c 作为用户的输入。

然后做:

*matrix[c]=malloc(sizeof(matrix[r][c]); //You get contiguous memory here

然后您可以像访问矩阵 [x][y] 一样访问矩阵,就像访问二维数组一样。

在一天结束时,清除分配的内存:

clear(matrix);

或者一种访问此矩阵和维度而不将它们传递为的方法 各种函数的参数?

嗯,是的。您通常会传递如下参数:

void print_matrix(char** matrix_copy,int rows,int cols)
{
//Access the matrix using matrix_copy[x][y] format
}

您可以像下面这样从main() 传递矩阵:

print_matrix(matrix,r,c); // As simple as that.

由于您不需要参数,因此您需要一个简单的解决方法

声明

char **matrix;
int r,c; // rows & columns

在所有函数之外,以便在整个程序中都可以访问它们。 换句话说,在文件范围内声明它们。但在这种情况下,请确保您仅在使用malloc 为其分配了一些空间后才能访问matrix

【讨论】:

  • 这可能是最糟糕的解决方案。它具有数据的内存位置。
  • @LightnessRacesinOrbit :如果操作具有仅跨越几个字节/字符的小尺寸矩阵,则可以保证空间局部性
  • 恰恰相反,因为你有一个额外的间接层。那就是问题所在。一般来说,双指针 = 不好。
【解决方案2】:

正如 sjsam 所说,动态内存分配是解决您问题的可行方案。 我想指出的唯一一点是代码可以是这样的:

int i,lin,col;
char **matrix;
matrix=malloc(lin * sizeof(char*));
//check for NULL
for(i=0;i<lin;i++){
    matrix[i]=malloc(col * sizeof(char));
    //again,check for NULL
}

然后,要释放分配的内存,您可以这样做:

for(i=0;i<lin;i++)
    free(matrix[i]);
free(matrix);

希望能回答您的问题!

【讨论】:

  • 在这种情况下,分配的内存不是连续的,即是碎片化的。你会得到很慢的糟糕代码,会烧毁和崩溃。
  • 是的,你是对的,但正如 OP 所说,她是一名初学者 C 程序员,我认为更简单的代码可能有助于她理解指针和“malloc”函数。感谢您指出这一点!
  • 这也不简单。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多