将固定大小的数组传递给具有指针参数的函数

时间:2017-10-31 14:23:15

标签: c arrays pointers multidimensional-array

我想知道有没有办法让下面的代码工作,或者我是否必须为固定大小创建一个新的函数副本?如果是这样,我怎样才能拥有固定尺寸的通用功能。

void prettyPrintMatrix_float(float **matrix, int rows, int cols){
    int i, j;

    for (i = 0; i<rows; i++){
        for (j = 0; j<cols; j++){
            printf("%10.3f", matrix[i][j]);
        }
        printf("\n");
    }
    return;
}

float ppArray[4][10] = {0.0f};
prettyPrintMatrix_float(ppArray, 4, 10);

发出错误Access violation reading location 0xFFFFF...

2 个答案:

答案 0 :(得分:2)

如果编译器支持可变长度数组,那么您可以定义类似

的函数
void prettyPrintMatrix_float( int rows, int cols, float matrix[rows][cols] ){
    int i, j;

    for (i = 0; i<rows; i++){
        for (j = 0; j<cols; j++){
            printf("%10.3f", matrix[i][j]);
        }
        printf("\n");
    }
}

否则你可以定义像

这样的功能
void prettyPrintMatrix_float(const float *matrix, int rows, int cols)
{
    for (int i = 0; i < rows; i++)
    {
        for (int j = 0; j < cols; j++)
        {
            printf("%10.3f", matrix[i * cols + j]);
        }
        putchar('\n');
    }
}

并将其称为

prettyPrintMatrix_float( ( const float * )ppArray, 4, 10);

答案 1 :(得分:0)

如果您无法使用可变长度数组,并且您的函数将采用不同维度的矩阵,那么您的函数将不得不将其视为一维数组并手动进行数学计算每行的开头是。像这样:

void prettyPrintMatrix_float(float *matrix, int rows, int cols){
    int i, j;

    for (i = 0; i<rows; i++){
        for (j = 0; j<cols; j++){
            printf("%10.3f", matrix[i * sizeof(float) + j]);
        }
        printf("\n");
    }
    return;
}

float ppArray[4][10] = {0.0f};
prettyPrintMatrix_float(&ppArray[0][0], 4, 10);