为什么这些代码会返回分段错误?我在网上搜索但无法找到问题。能否请你帮忙? 是因为指针malloc故障吗?
void multiply(int **a, int n, int m, int **b, int m2, int p, int **c)
{
int i, j, k;
for (i = 0; i < n; i++){
for (j = 0; j < p; j++){
for (k = 0; k < m; k++){
c[i][j] += a[i][k] * b[k][j];
}
printf("%d", c);}}
}
main()
{
int **a, **b, **c;
int n, m, p;
int i, j;
scanf("%d", &n); scanf("%d", &m); scanf("%d", &p);
a = (int **)malloc(n*sizeof(int*));
for (i = 0; i < n; i++){
a[i] = (int*)malloc(m*sizeof(int));}
for (i = 0; i < n; i++){
for (j = 0; j < m; j++){
scanf("%d", &a[i][j]);}
}
b = (int **)malloc(m*sizeof(int*));
for (i = 0; i < m; i++){
b[i] = (int *)malloc(p*sizeof(int));}
for (i = 0; i < m; i++){
for (j = 0; j < p; j++){
scanf("%d", &b[i][j]);}
}
c = (int **)malloc(n, sizeof(int));
for (i = 0; i<n; i++)
c[i] = (int *)malloc(p, sizeof(int));
multiply(a, n, m, b, m, p, c);
free(a);
free(b);
free(c);
}
感谢^^
我编辑了一些代码,现在它是正确的。非常感谢你们。 干杯!
答案 0 :(得分:1)
如果您使用的是LP64架构(int为32位且int *为64位),c太小,则应使用
c = (int **)calloc(n, sizeof(int*));
答案 1 :(得分:1)
你这里有一个错字:
for (k = 0; k < m; j++){
^
这应该是:
for (k = 0; k < m; k++){
^
此外:
multiply(**a, n, m, **b, m, p, **c);
应该是:
multiply(a, n, m, b, m, p, c);
请注意,如果您打开了编译器警告,那么编译器会帮助您指出这个错误。