在 C 中将双指针作为二维数组传递

问题描述 投票:0回答:1

在我的代码中,我将一个双指针传递给一个整数作为二维数组的表示,但出现了段错误 - 当我将数组作为数组传递(用括号代替)时,这个问题得到了修复(很奇怪)

这是主要功能:

int main(void) {
    int matrix[3][3] = {
        {0, 1, 0},
        {0, 0, 1},
        {0, 1, 0}
    };
    printf("matrix first value outside func %d", matrix[0][0]);
    CSR* csr_val = convert_to_csr(matrix, 3, 3);
    output(csr_val, stdout, 1);
}   

这是函数convert_to_csr的开始

CSR* convert_to_csr(int **matrix, size_t row_len, size_t col_len){
    printf("first value of array %d", **matrix);

当我运行它时,这本质上会产生段错误,但是当我使用矩阵形式(即矩阵[][3])时,它工作得很好。这与该矩阵不是动态分配而是在堆栈上分配的事实有什么关系吗?

如果我无法在编译时保证矩阵的大小,我将如何实现这个?

上面列出了我尝试过的方法以及有效的方法

c pointers memory multidimensional-array segmentation-fault
1个回答
0
投票

这与这个矩阵不是这个事实有什么关系吗? 动态分配,而是在堆栈上分配?

数组声明如下

int matrix[3][3] = {
    {0, 1, 0},
    {0, 0, 1},
    {0, 1, 0}
};

用作函数调用中的参数表达式

convert_to_csr
声明如下

CSR* convert_to_csr(int **matrix, size_t row_len, size_t col_len);

隐式转换为指向

int ( * )[3]
类型的第一个元素的指针。但相应的函数参数具有类型
int **
并且这些指针类型不兼容。

请注意,您可以像这样动态分配数组

int ( *matrix )[3] = malloc( sizeof( int[3][3] ) );

但是你也会遇到同样的问题,指针类型不兼容。

如果您的编译器支持可变长度数组,那么您可以像这样声明函数

CSR* convert_to_csr( size_t row_len, size_t col_len, int matrix[row_len][col_len] );

并传递给具有不同 row_len 和 col_len 值的函数数组。

© www.soinside.com 2019 - 2024. All rights reserved.