分段错误,c程序

时间:2015-03-03 17:07:25

标签: c

为什么这些代码会返回分段错误?我在网上搜索但无法找到问题。能否请你帮忙? 是因为指针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);
}

感谢^^

我编辑了一些代码,现在它是正确的。非常感谢你们。 干杯!

2 个答案:

答案 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);

请注意,如果您打开了编译器警告,那么编译器会帮助您指出这个错误。

另请注意you should not cast the result of malloc in C.