这个程序有一些西班牙语的部分,所以我将解释:它是一个动态的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
答案 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;
}