Segmentation fault (core dumped) Fehler in C
Ich bin versucht, schreiben Sie ein C-Programm zu summieren und subtrahieren von zwei komplexen zahlen.
Hier ist der code:
#include <stdlib.h>
#include <stdio.h>
typedef struct cplx
{
int re;
int im;
} cplx;
cplx* sum(cplx *x, cplx *y,int n)
{
cplx *z; int i;
for(i=0;i<n;i++)
{
z[i].re=x[i].re+y[i].re;
z[i].im=x[i].im+y[i].im;
}
return z;
}
cplx* difference(cplx *x, cplx *y, int n)
{
cplx *z; int i;
for(i=0;i<n;i++)
{
z[i].re=x[i].re-y[i].re;
z[i].im=x[i].im-y[i].im;
}
return z;
}
cplx* sumdiff(cplx *x,cplx *y, int n,cplx* (*op)())
{
return(op(x,y,n));
}
int main(void)
{
cplx *z1,*z2,*s,*diff;
int m,n,i;
printf("Give the number of complex numbers to add and substract:");
scanf("%d",&n);
z1=(cplx*)malloc(n*sizeof(cplx));
z2=(cplx*)malloc(n*sizeof(cplx));
s=(cplx*)malloc(n*sizeof(cplx));
diff=(cplx*)malloc(n*sizeof(cplx));
if ( z1==NULL || z2==NULL || s==NULL || diff==NULL)
{
printf("Allocation failed.\nEnding program.");
exit(0);
}
printf("Give the numbers of the first vector:\n");
for(i=0;i<n;i++)
{
printf("Re(z1[%d])=",i+1); scanf("%d",&m);
z1[i].re=m;
printf("Im(z1[%d])=",i+1); scanf("%d",&(z1[i].im));
}
printf("Give the numbers of the second vector:\n");
for(i=0;i<n;i++)
{
printf("Re(z2[%d])=",i+1); scanf("%d",&(z2[i].re));
printf("Im(z2[%d])=",i+1); scanf("%d",&(z2[i].im));
}
s=sum(z1,z2,n);
diff=difference(z1,z2,n);
s=sumdiff(z1,z2,n,sum);
diff=sumdiff(z1,z2,n,difference);
for(i=0;i<n;i++)
{
printf("z1[%d]+z2[%d]=%d+j(%d)\nz1[%d]+z2[%d]=%d+j(%d)\n",i+1,i+1,s[i+1].re,s[i+1].im,i,i,diff[i+1].re,diff[i+1].im);
}
free(z1); free(z2); free(s); free(diff);
return 0;
}
Kompiliert er fein mit GCC, aber wenn ich es ausführen, wird die Ausführung angehalten wird, bevor s=sum(z1,z2,n); mit einem " segmentation fault (core dumped).
Was mache ich falsch ?
Sie nie zuordnen
Ein Vorschlag: statt das zu tun
z
in Ihren Funktionen.Ein Vorschlag: statt das zu tun
z1==NULL
einfache !z1
und in z1=(cplx*)malloc(n*sizeof(cplx));
Sie nicht zu tun haben, die-cast in C (es ist Fehler anfällig ist, wenn Sie es tun), so haben z1 = malloc(n*sizeof(cplx));
.
InformationsquelleAutor James Dean | 2013-05-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
z
imsum
unddifference
ist ein uninitialised Zeiger. Sie erhalten ein Undefiniertes Verhalten (und wahrscheinlich crash), wenn Sie versuchen, zu schreiben. Müssen Sie Speicher fürz
in jeder dieser Funktionen.Sie müssen auch sicherstellen, dass Sie
free
die Erinnerung kehrte von diesen Funktionen. Der codewürden derzeit Auslaufen der ersten Instanz von beiden
s
unddiff
InformationsquelleAutor simonc