将矩阵传递给 C 函数时出现分段错误
Segmentation fault in passing matrix to C function
我无法弄清楚这段代码有什么问题(并且无法从之前的问答中找到任何建议):
#include<stdio.h>
void fld(const int **b){
int i, j ;
printf("Hello R\n");
for (i=0; i<3; i++){
for (j = 0; j<3; j++)
printf("%d", b[i][j]);
printf("\n");
}
return;
}
int main(){
int i, j;
int b[3][3] = {
{1,1,1},
{1,2,1},
{2,2,2}
};
fld((void **)b);
system("pause");
return;
}
我试图将矩阵传递给函数 fld 并将其打印出来,但它在 运行 代码时一直报告分段错误。
void fld(const int b[][3]){
int i, j;
printf("Hello R\n");
for (i=0; i<3; i++){
for (j = 0; j<3; j++)
printf("%d", b[i][j]);
printf("\n");
}
return;
}
int main(int argc, char** argv) {
int b[3][3] = {
{1,1,1},
{1,2,1},
{2,2,2}
};
fld(b);
return 0;
};
使用 g++ 编译和运行
这是一个在堆上动态分配内存的版本。它的工作方式类似于 main()
参数 *argv[]
即数组的数组(尽管在那种情况下行长度可能不同)。在这个答案中,您不需要传递 fld()
的数组大小来工作:而是告诉它何时停止!原因是,它是一个一维数组指针,每个数组指针也是一个一维数组。您也可以将相同的方法扩展到 3-D 数组。
#include <stdio.h>
#include <stdlib.h>
int **intarray(int rows, int cols) {
int r;
int **arr = malloc(rows*sizeof(int*)); // here an array of pointers
if (arr == NULL)
return NULL;
for (r=0; r<rows; r++) {
arr[r] = malloc(cols*sizeof(int)); // here an array of ints
if (arr[r] == NULL)
return NULL;
}
return arr;
}
void fld(const int **b, int rows, int cols){
int i, j ;
printf("Hello R\n");
for (i=0; i<rows; i++){
for (j = 0; j<cols; j++)
printf("%-5d", b[i][j]);
printf("\n");
}
return;
}
int main(void) {
int i, j;
int **b = intarray(3, 3);
if (b == NULL)
return 0;
for (i=0; i<3; i++)
for (j=0; j<3; j++)
b[i][j] = i*100 +j;
fld(b, 3, 3);
// free() the memory
return 0;
}
程序输出
Hello R
0 1 2
100 101 102
200 201 202
我无法弄清楚这段代码有什么问题(并且无法从之前的问答中找到任何建议):
#include<stdio.h>
void fld(const int **b){
int i, j ;
printf("Hello R\n");
for (i=0; i<3; i++){
for (j = 0; j<3; j++)
printf("%d", b[i][j]);
printf("\n");
}
return;
}
int main(){
int i, j;
int b[3][3] = {
{1,1,1},
{1,2,1},
{2,2,2}
};
fld((void **)b);
system("pause");
return;
}
我试图将矩阵传递给函数 fld 并将其打印出来,但它在 运行 代码时一直报告分段错误。
void fld(const int b[][3]){
int i, j;
printf("Hello R\n");
for (i=0; i<3; i++){
for (j = 0; j<3; j++)
printf("%d", b[i][j]);
printf("\n");
}
return;
}
int main(int argc, char** argv) {
int b[3][3] = {
{1,1,1},
{1,2,1},
{2,2,2}
};
fld(b);
return 0;
};
使用 g++ 编译和运行
这是一个在堆上动态分配内存的版本。它的工作方式类似于 main()
参数 *argv[]
即数组的数组(尽管在那种情况下行长度可能不同)。在这个答案中,您不需要传递 fld()
的数组大小来工作:而是告诉它何时停止!原因是,它是一个一维数组指针,每个数组指针也是一个一维数组。您也可以将相同的方法扩展到 3-D 数组。
#include <stdio.h>
#include <stdlib.h>
int **intarray(int rows, int cols) {
int r;
int **arr = malloc(rows*sizeof(int*)); // here an array of pointers
if (arr == NULL)
return NULL;
for (r=0; r<rows; r++) {
arr[r] = malloc(cols*sizeof(int)); // here an array of ints
if (arr[r] == NULL)
return NULL;
}
return arr;
}
void fld(const int **b, int rows, int cols){
int i, j ;
printf("Hello R\n");
for (i=0; i<rows; i++){
for (j = 0; j<cols; j++)
printf("%-5d", b[i][j]);
printf("\n");
}
return;
}
int main(void) {
int i, j;
int **b = intarray(3, 3);
if (b == NULL)
return 0;
for (i=0; i<3; i++)
for (j=0; j<3; j++)
b[i][j] = i*100 +j;
fld(b, 3, 3);
// free() the memory
return 0;
}
程序输出
Hello R
0 1 2
100 101 102
200 201 202