【问题标题】:C11 VLA matrix accessC11 VLA 矩阵访问
【发布时间】:2015-04-16 13:50:24
【问题描述】:

C11 允许像使用 VLA 数组(和矩阵)

int row = 10;
int col = 10;
double matrix[row][col];

但是如果我想传递给一个函数,我只能使用矩阵的一行

matrix[row_selected]

好像我已经将矩阵定义为

double **matrix_old_style = (double **)malloc(sizeof(double *) * row);
for(i=0;i<row;i++)
matrix_old_style[i] = (double *)malloc(siezeof(double) * col);

或者matrix[row_selected]不是指向正确位置的指针(比如matrix_old_style[row_selected])?

【问题讨论】:

  • 不,它们根本不一样。

标签: c dynamic matrix


【解决方案1】:

不,二维数组和通过指针指向指针的伪数组根本不一样。

要将 VLA 作为函数参数传递,只需这样做

void foo(size_t n, size_t m, double A[n][m]);

或类似的。请注意,大小位于数组之前,因此 nm 在此时是已知的。如果您始终如一地使用该概念,编译器将负责索引计算等。

但请注意,通常您不希望将此类野兽分配为 auto 变量,因为它们可能会爆炸您的堆栈。更好用

double (*matrix)[col] = malloc(sizeof(double[row][col]));

当你将它传递给函数时,编译器会重写它,无论如何,当它作为函数参数使用时。

【讨论】:

  • @AndreaOliveri,如果这回答了您的问题,请单击按钮接受它,因此它会将“状态”更改为成功回答。
【解决方案2】:

当然可以,看看这段代码:

#include <iostream>
using namespace std;
void fun(int a[6])
{
    cout << a[3] << endl; 
}
int main()
{
    int a[5][6];
    for (int i=0;i<5;i++)
        for (int j=0;j<6;j++)
            a[i][j]=i+j;

    cout << a[2][3] << endl;
    cout << *(*(a+2)+3) << endl;
    fun(a[2]);
    return 0;
}

三个输出是一样的!

【讨论】:

  • 问题不是针对C++的,
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-25
  • 2011-06-24
  • 2013-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多