2013-05-15 2 views
1

Я пытаюсь написать программу на C, чтобы суммировать и вычесть два комплексных числа. Вот код:Ошибка сегментации (сбрасываемая сердцевина) в C

#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; 
} 

Это нормально компилируется с GCC, но когда я запускаю его, выполнение останавливается до S = сумма (z1, z2, п); с ошибкой сегментации (сбрасывается ядро). Что я делаю неправильно?

+2

Вы никогда не выделить 'z' в ваших функциях. –

+0

Одно предложение: вместо выполнения 'z1 == NULL' сделать простой'! Z1' и в 'z1 = (cplx *) malloc (n * sizeof (cplx));' вам не нужно делать актерский состав в C (это ошибка, если вы это сделаете), так что 'z1 = malloc (n * sizeof (cplx));'. –

ответ

2

z в sum и difference - неинициализированный указатель. Когда вы пытаетесь написать это, вы получаете неопределенное поведение (и, вероятно, сбой). Вы должны выделить память для z в каждой из этих функций.

cplx* sum(cplx *x, cplx *y,int n) 
{ 
    cplx *z = malloc(n * sizeof(*z)); 
    int i; 
    if (z == NULL) { 
     return NULL; 
    } 

Вы также должны убедиться, что вы free память вернулась из этих функций. Код

s=sum(z1,z2,n); 
diff=difference(z1,z2,n); 
s=sumdiff(z1,z2,n,sum); 
diff=sumdiff(z1,z2,n,difference); 

бы в настоящее время утечки первый экземпляр как s и diff