| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 832 人关注过本帖
标题:求助:实现两个矩阵的乘法bug(Program receive signal SIGSEGV,Segmentati ...
只看楼主 加入收藏
Johnalex
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2015-2-11
结帖率:33.33%
收藏
已结贴  问题点数:20 回复次数:6 
求助:实现两个矩阵的乘法bug(Program receive signal SIGSEGV,Segmentation fault)
程序代码:
/*实现两个矩阵的乘法*/
#include<stdio.h>
#include<stdlib.h>
int main()
{
    int r1,c1;      //分别为第一个矩阵的行数 列数 
    int r2,c2;
    int**matrix1;    //声明第一个矩阵 
    int**matrix2;
    int**matrix_result;
    printf("Please input the first Matrix's row\n");
    scanf("%d",&r1);
    printf("Please input the first Matrix's column\n");
    scanf("%d",&c1);
    matrix1= (int **)malloc(sizeof(int *)*r1);    //为第一个矩阵申请内存空间 
    for (int i=0; i<r1; i++)
    matrix1[i] = (int *)malloc(sizeof(int)*c1);  
    for(int i=0;i<r1;i++)
    for(int j=0;j<c1;j++)
    scanf("%d",&matrix1[i][j]);

    
    printf("Please input the second Matrix's row\n");
    scanf("%d",&r2);
    printf("Please input the second Matrix's column\n");
    scanf("%d",&c2);
    matrix2= (int **)malloc(sizeof(int *)*r2);
    for (int i=0; i<r2; i++)
    matrix1[i] = (int *)malloc(sizeof(int)*c2);   
    for(int i=0;i<r2;i++)
    for(int j=0;j<c2;j++)
    scanf("%d",&matrix1[i][j]);


    printf("The first matrix is \n");     //输出第一个矩阵
    for(int i=0;i<r1;i++)
    {
    for(int j=0;j<c1;j++)
    printf("%-5d",matrix1[i][j]);
    printf("\n");
    }
    
    
    
    printf("The second matrix is \n");    
    for(int i=0;i<r2;i++)
    {
    for(int j=0;j<c2;j++)
    printf("%-5d",matrix1[i][j]);
    printf("\n");
    }
    
    if(c1!=r2)                 //如果不符合矩阵的计算法则 则退出 
    {
        printf("These matrixs are not reasonable!!!\n");
        return -1;
    }
    else
    {
    matrix_result= (int **)malloc(sizeof(int *)*r1);    //为计算后的矩阵申请内存 
    for (int k=0; k<r1; k++)
    matrix_result[k] = (int *)malloc(sizeof(int)*c2); 
    for(int i=0;i<r1;i++)
       for(int j=0;j<c2;j++)
       {
        matrix_result[i][j]=0;
       for(int m=0, n=0;m<c1;m++,n++)
       matrix_result[i][j]+=(matrix1[i][m]*matrix2[n][j]);   //计算输出矩阵中第i行,第j列的元素 
       }
       for(int p=0;p<r1;p++)                                  //输出计算结果 
    {
    for(int q=0;q<c2;q++)
    printf("%-5d",matrix1[p][q]);
    printf("\n");
    }
    }
    for (int f1=0;f1<r1;f1++) free(matrix1[f1]);              //释放内存空间 
    free(matrix1);
    for (int f2=0;f2<r2;f2++) free(matrix2[f2]);
    free(matrix2);
    for (int f3=0;f3<r1;f3++) free(matrix_result[f3]);
    free(matrix_result);
    return 0;
}

GDB调试后显示如图
图片附件: 游客没有浏览图片的权限,请 登录注册

且指明 matrix_result[i][j]+=(matrix1[i][m]*matrix2[n][j]);   //计算输出矩阵中第i行,第j列的元素 有错
搜索更多相关主题的帖子: receive 
2015-02-12 00:03
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9007
专家分:53942
注 册:2011-1-18
收藏
得分:5 
matrix1[i] = (int *)malloc(sizeof(int)*c2);
matrix2[i] = (int *)malloc(sizeof(int)*c2);
好多地方写错了,下同。
2015-02-12 08:30
Johnalex
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2015-2-11
收藏
得分:0 
回复 2楼 rjsp
就那一个地方啊😳😔
改了好像也不对😭
2015-02-12 12:40
Johnalex
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2015-2-11
收藏
得分:0 
回复 2楼 rjsp
图片附件: 游客没有浏览图片的权限,请 登录注册

程序可以 正常运行了,但是输出为错误值,找了半天也不知道那里错了,实在是不知道怎么办了.如果您能帮我找出错误,万分感谢啊.
程序代码:
/*实现两个矩阵的乘法*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
    int r1,c1;      //分别为第一个矩阵的行数 列数 
    int r2,c2;
    int**matrix1;    //声明第一个矩阵 
    int**matrix2;
    int**matrix_result;
    printf("Please input the first Matrix's row\n");
    scanf("%d",&r1);
    printf("Please input the first Matrix's column\n");
    scanf("%d",&c1);
    matrix1= (int **)malloc(sizeof(int *)*r1);    //为第一个矩阵申请内存空间 
    for (int i=0; i<r1; i++)
    matrix1[i] = (int *)malloc(sizeof(int)*c1);  
    for(int i=0;i<r1;i++)
    for(int j=0;j<c1;j++)
    scanf("%d",&matrix1[i][j]);

    printf("Please input the second Matrix's row\n");
    scanf("%d",&r2);
    printf("Please input the second Matrix's column\n");
    scanf("%d",&c2);
    matrix2= (int **)malloc(sizeof(int *)*r2);
    for (int i=0; i<r2; i++)
    matrix2[i] = (int *)malloc(sizeof(int)*c2);   
    for(int i=0;i<r2;i++)
    for(int j=0;j<c2;j++)
    scanf("%d",&matrix1[i][j]);

    printf("The first matrix is \n");     //输出第一个矩阵
    for(int i=0;i<r1;i++)
    {
    for(int j=0;j<c1;j++)
    printf("%-5d",matrix1[i][j]);
    printf("\n");
    }
    
    printf("The second matrix is \n");    
    for(int i=0;i<r2;i++)
    {
    for(int j=0;j<c2;j++)
    printf("%-5d",matrix1[i][j]);
    printf("\n");
    }
    
    if(c1!=r2)                 //如果不符合矩阵的计算法则 则退出 
    {
        printf("These matrixs are not reasonable!!!\n");
        return -1;
    }
    else
    {
    matrix_result= (int **)calloc(0,sizeof(int *)*r1);    //为计算后的矩阵申请内存 
    for (int k=0; k<r1; k++)
    matrix_result[k] = (int *)calloc(0,sizeof(int)*c2); 
    for(int i=0;i<r1;i++)
       for(int j=0;j<c2;j++)
         for(int m=0;m<c1;m++)
       matrix_result[i][j]+=matrix1[i][m]*matrix2[m][j];   //计算输出矩阵中第i行,第j列的元素 
       printf("The result is\n");
    for(int p=0;p<r1;p++)                                  //输出计算结果 
    {
    for(int q=0;q<c2;q++)
    printf("%-10d",matrix_result[p][q]);
    printf("\n");
    }
    }
    for (int f1=0;f1<r1;f1++) free(matrix1[f1]);              //释放内存空间 
    free(matrix1);
    for (int f2=0;f2<r2;f2++) free(matrix2[f2]);
    free(matrix2);
    for (int f3=0;f3<r1;f3++) free(matrix_result[f3]);
    free(matrix_result);
    return 0;
}
2015-02-12 20:10
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9007
专家分:53942
注 册:2011-1-18
收藏
得分:15 
马虎不是坏事,但马虎的性格不适合写代码。
已经跟你说了“好多地方写错”,你硬要说“就那一个地方啊”,昨天也没搭理你,因为我以为你自己运行测试一下就能自己发现问题。

现在你运行测试了,但令人吐血的是,你输入的是两个相同的矩阵。我认为你这是故意捣乱了。既然是测试,当然输入数据越普通涵盖的测试路径越多。
你输入两个相同的矩阵,怎么能发现 matrix1 和 matrix2 搞混了?

我大体看了一下,有如下几个错误
a. 使用指针的指针,属于设计错误,建议 malloc( row*col*sizeof(int) )
b. matrix1[i] = (int *)malloc(sizeof(int)*c2);
   scanf("%d",&matrix1[i][j]);
   printf("%-5d",matrix1[i][j]);
   calloc(0,sizeof(int *)*r1) 你自己去看看calloc的参数说明吧
   calloc(0,sizeof(int)*c2)
c. if(c1!=r2) 分支未释放内存
2015-02-13 09:07
Johnalex
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2015-2-11
收藏
得分:0 
  谢谢您 下次一定会在注意的
2015-02-13 13:18
Johnalex
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2015-2-11
收藏
得分:0 
回复 5楼 rjsp
改了下标 果然就可以正常运行了,真是马虎坏了大事啊.您提出的其他建议我也会修改
2015-02-13 13:25
快速回复:求助:实现两个矩阵的乘法bug(Program receive signal SIGSEGV,Segme ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019870 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved