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

时间:2015-02-19 15:05:17

标签: c arrays pointers

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

我尝试使用经典的二维阵列形式,但它仍然与[i] [j]崩溃,其中包含(a + i)+ j)。我尝试在没有printf的情况下运行程序,并且在到达suma()时会崩溃,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

1 个答案:

答案 0 :(得分:1)

这是问题

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

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

总是使用正确的函数名称,这个(*(a + i) + j)也没关系,但是你看来很困惑。

使用数组索引表示法来避免问题。

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

BTW scanf()有一个返回值,检查一下,如果你不小心给程序一些无效输入,那么每个malloc()你也会发生意想不到的问题需要free()并且不要使用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;
}