在我的代码中,我将一个双指针传递给一个整数作为二维数组的表示,但出现了段错误 - 当我将数组作为数组传递(用括号代替)时,这个问题得到了修复(很奇怪)
这是主要功能:
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])时,它工作得很好。这与该矩阵不是动态分配而是在堆栈上分配的事实有什么关系吗?
如果我无法在编译时保证矩阵的大小,我将如何实现这个?
上面列出了我尝试过的方法以及有效的方法
这与这个矩阵不是这个事实有什么关系吗? 动态分配,而是在堆栈上分配?
数组声明如下
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 值的函数数组。