具有动态矩阵的程序在到达printf时崩溃

萨尔瓦多·比利亚雷亚尔

该程序的某些部分用西班牙语编写,所以我将解释:这是一个动态2D数组,向用户显示一条消息,要求输入行数和列数。然后,数组使用函数aloc获得分配的空间,其中calloc用于分配,第二个指针接收行数,然后使用for()循环为列分配空间。问题出现在函数imp()上,该函数应该打印出结果矩阵,我相信这是由于指针算法引起的,但是我不确定。程序崩溃了,但是在编译过程中没有问题,据我所知,所有操作都是有效的。

我尝试使用经典的2D数组形式,但是它仍然会因 [a + i)+ j)插入的[a] [i] [j]而崩溃我尝试在没有printf的情况下运行该程序,并且在到达suma()时会崩溃,应该将这两个矩阵相加,我相信在达到指针算法时也会崩溃。当这些被忽略时,程序运行顺利。

#include<stdio.h>
#include<stdlib.h>
#define p printf
#define s scanf

float** aloc(float **m,int r,int c);
void asig(float **a,int r,int c);
void imp(float **a,int r,int c);
float** suma(float **a,float **b,float **c,int r,int x);

int main(int argc,char*argv[])
{
    float **ma=NULL,**mb=NULL,**mc=NULL;
    int r=0,c=0,i=0,j=0;
    p("\n\tEste programa suma 2 matrices cuyas dimensiones son dadas por el usuario\n\n\t%cCu%cntos renglones tienen las matrices?",168,160);
    s("%d",&r);
    p("\n\t%cCu%cntas columnas tienen las matrices?",168,160);
    s("%d",&c);
    ma=aloc(ma,r,c);
    mb=aloc(mb,r,c);
    mc=aloc(mc,r,c);
    p("\n\n\t\tMATRIZ 1");
    asig(ma,r,c);
    imp(ma,r,c);
    p("--------------------------\n\n\t\tMATRIZ 2");
    asig(mb,r,c);
    imp(mb,r,c);
    p("--------------------------");
    mc=suma(ma,mb,mc,r,c);
    p("\n\tLa matriz resultante es:\n");
    imp(mc,r,c);
    fflush(stdin);
    getchar();
    return 0;
}

float** aloc(float **m,int r,int c)
{
    int i=0;
    if((m=(float**)calloc(r,sizeof(float*)))==NULL)
    {
        p("Error al asignar espacio");
        exit(0);
    }
    for(i=0;i<r;i++)
        if((m[i]=(float*)calloc(c,sizeof(float)))==NULL)
        {
            p("Error al asignar espacio");
            exit(0);
        }
    return m;
}

void asig(float **a,int r,int c)
{
    int i=0,j=0;
    for(i=0;i<r;i++)
        for(j=0;j<c;j++)
        {
            p("\n\t%cCu%cl es el elemento [%d][%d] de la matriz?",168,160,i+1,j+1);
            s("%f",((a+i)+j));
        }
}

void imp(float **a,int r,int c)
{

    int i=0,j=0;
    p("\n\tLa matriz queda:\n");
    for(i=0;i<r;i++)
    {
        for(j=0;j<c;j++)
        {
            p("%f ",*(*(a+i)+j));
        }
        p("\n");
    }
}

float** suma(float **a,float **b,float **c,int r,int x)
{
    int i=0,j=0;
    for(i=0;i<r;i++)
        for(j=0;j<x;j++)
            *(*(c+i)+j)=*(*(a+i)+j)+*(*(b+i)+j);
    return c;
}de here
伊哈罗布·阿西米(Iharob Al Asimi)

这是问题所在

s("%f", ((a + i) + j));

scanf("%f", &a[i][j]);

始终使用正确的函数名称,这(*(a + i) + j)也是可以的,但是如您所见,这令人困惑。

使用数组索引表示法可以避免出现问题。

如果您想知道我是如何在发布的烂摊子中找到它的,则使用了编译器警告。他们是你的朋友。

顺便说一句scanf()有一个返回值,请检查它,如果您不小心给程序提供了一些无效的输入,那么将会发生意外的问题,对于每个malloc()您都需要afree()并且不要使用它,calloc()除非您打算稍后将这些值初始化为零。将初始化每个值的使用malloc()

这是程序的更正版本

#include <stdio.h>
#include <stdlib.h>

float** aloc(float **m,int r,int c);
void asig(float **a,int r,int c);
void imp(float **a,int r,int c);
float** suma(float **a,float **b,float **c,int r,int x);

int main()
{
    float **ma = NULL,**mb = NULL,**mc = NULL;
    int r = 0, c = 0;

    printf("\n\tEste programa suma 2 matrices cuyas dimensiones son dadas por el usuario\n\n\t%cCu%cntos renglones tienen las matrices?",168,160);
    if (scanf("%d", &r) != 1)
        return -1;
    printf("\n\t%cCu%cntas columnas tienen las matrices?", 168, 160);
    if (scanf("%d", &c) != 1)
        return -1;

    ma = aloc(ma, r, c);
    if (ma == NULL)
        goto failed;
    mb = aloc(mb, r, c);
    if (mb == NULL)
        goto failed;
    mc = aloc(mc, r, c);
    if (mc == NULL)
        goto failed;
    printf("\n\n\t\tMATRIZ 1");

    asig(ma, r, c);
    imp(ma, r, c);

    printf("--------------------------\n\n\t\tMATRIZ 2");

    asig(mb, r, c);
    imp(mb, r, c);

    printf("--------------------------");

    mc = suma(ma, mb, mc, r, c);

    printf("\n\tLa matriz resultante es:\n");

    imp(mc, r, c);
    getchar();

    free(ma);
    free(mb);
    free(mc);

    return 0;

failed:
    free(ma);
    free(mb);
    free(mc);

    return -1;
}

float** aloc(float **m,int r,int c)
{
    int i = 0;

    if ((m = calloc(r, sizeof(float*))) == NULL)
    {
        printf("Error al asignar espacio");
        return NULL;
    }

    for (i = 0 ; i < r ; i++)
    {
        if ((m[i] = calloc(c, sizeof(float))) == NULL)
        {
            int j;
            for (j = i ; j >= 0 ; j--)
                free(m[j]);
            free(m);
            return NULL;
        }
    }
    return m;
}

void asig(float **a,int r,int c)
{
    int i = 0, j = 0;
    for(i = 0 ; i < r ; i++)
    {
        for(j = 0 ; j < c ; j++)
        {
            printf("\n\t%cCu%cl es el elemento [%d][%d] de la matriz?", 168, 160, i + 1, j + 1);
            scanf("%f", &a[i][j]);
        }
    }
}

void imp(float **a,int r,int c)
{

    int i = 0,j = 0;
    printf("\n\tLa matriz queda:\n");
    for(i = 0 ; i < r ; i++)
    {
        for(j = 0 ; j < c ; j++)
        {
            printf("%10f", a[i][j]);
        }
        printf("\n");
    }
}

float** suma(float **a,float **b,float **c,int r,int x)
{
    int i = 0,j  = 0;
    for(i = 0 ; i < r ; i++)
    {
        for(j = 0 ; j < x ; j++)
        {
            c[i][j] = a[i][j] + b[i][j];
        }
    }
    return c;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Python 36(Eclipse Oxygen,PyDev)在到达断点时崩溃

来自分类Dev

Java程序停顿,然后在到达循环时停止

来自分类Dev

程序在到达while循环之前结束

来自分类Dev

在到达Django Oscar时付款?

来自分类Dev

到达一条线时程序崩溃

来自分类Dev

如何使用JQuery在到达div点时删除文本

来自分类Dev

到达getInputStream时Android崩溃

来自分类Dev

动态分配内存时,程序有时会崩溃

来自分类Dev

选择具有特定分辨率的图像时,应用程序崩溃

来自分类Dev

具有Swift 5逆向关系的领域在启动时使应用程序崩溃

来自分类Dev

尝试打开具有可变文件名的文件时,c程序崩溃

来自分类Dev

具有推送通知功能的 React Native 应用程序在启动时崩溃

来自分类Dev

没有终端时捕获程序崩溃

来自分类Dev

当MATLAB文件到达mxSetPr时,MATLAB崩溃

来自分类Dev

当MATLAB文件到达mxSetPr时,MATLAB崩溃

来自分类Dev

具有HTML / CSS的动态定价表/功能矩阵

来自分类Dev

具有HTML / CSS的动态定价表/功能矩阵

来自分类Dev

具有动态矩阵轴值的声明性管道

来自分类Dev

工作线程在到达使用块 C# Windows 窗体应用程序时停止执行

来自分类Dev

在C ++程序中使用动态编程的矩阵链乘法会崩溃吗?

来自分类Dev

具有Objective-C的应用程序,在发布模式下启动时快速代码崩溃,调试模式很好

来自分类Dev

具有完整信任流程表格应用程序的UWP Package的商店版本在启动时不断崩溃

来自分类Dev

Android:滚动具有2个不同单元格的列表视图时,应用程序崩溃

来自分类Dev

Android-ListView在到达终点时加载更多项目

来自分类Dev

在到达第一个None时如何停止构建Option [Collection]?

来自分类Dev

如何制作动画情节以在到达最后一个动画步骤时停止回滚?

来自分类Dev

正则表达式在到达&nbsp;时停止检测链接

来自分类Dev

返回浮点指针会在到达主函数时更改地址

来自分类Dev

在到达第一个None时如何停止构建Option [Collection]?

Related 相关文章

  1. 1

    Python 36(Eclipse Oxygen,PyDev)在到达断点时崩溃

  2. 2

    Java程序停顿,然后在到达循环时停止

  3. 3

    程序在到达while循环之前结束

  4. 4

    在到达Django Oscar时付款?

  5. 5

    到达一条线时程序崩溃

  6. 6

    如何使用JQuery在到达div点时删除文本

  7. 7

    到达getInputStream时Android崩溃

  8. 8

    动态分配内存时,程序有时会崩溃

  9. 9

    选择具有特定分辨率的图像时,应用程序崩溃

  10. 10

    具有Swift 5逆向关系的领域在启动时使应用程序崩溃

  11. 11

    尝试打开具有可变文件名的文件时,c程序崩溃

  12. 12

    具有推送通知功能的 React Native 应用程序在启动时崩溃

  13. 13

    没有终端时捕获程序崩溃

  14. 14

    当MATLAB文件到达mxSetPr时,MATLAB崩溃

  15. 15

    当MATLAB文件到达mxSetPr时,MATLAB崩溃

  16. 16

    具有HTML / CSS的动态定价表/功能矩阵

  17. 17

    具有HTML / CSS的动态定价表/功能矩阵

  18. 18

    具有动态矩阵轴值的声明性管道

  19. 19

    工作线程在到达使用块 C# Windows 窗体应用程序时停止执行

  20. 20

    在C ++程序中使用动态编程的矩阵链乘法会崩溃吗?

  21. 21

    具有Objective-C的应用程序,在发布模式下启动时快速代码崩溃,调试模式很好

  22. 22

    具有完整信任流程表格应用程序的UWP Package的商店版本在启动时不断崩溃

  23. 23

    Android:滚动具有2个不同单元格的列表视图时,应用程序崩溃

  24. 24

    Android-ListView在到达终点时加载更多项目

  25. 25

    在到达第一个None时如何停止构建Option [Collection]?

  26. 26

    如何制作动画情节以在到达最后一个动画步骤时停止回滚?

  27. 27

    正则表达式在到达&nbsp;时停止检测链接

  28. 28

    返回浮点指针会在到达主函数时更改地址

  29. 29

    在到达第一个None时如何停止构建Option [Collection]?

热门标签

归档