2015-12-08 69 views
0

我必須幫助我的一個朋友,但我已經忘記了一點C.:\該代碼有什麼問題?必須有一些指針錯誤。它給了我一個訪問違反閱讀記憶。可能是什麼問題呢?主要任務是:2個無限數組,並且必須計算一個數組。指針錯誤?訪問違反內存讀取

編輯版本:閱讀是好的,但可以通過literaly罰款。正如我記得我不應該返回一個指針,我可以返回一個計數器來計算附加到A和B數組有多少個數字?

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

double *bekerdezo1(double *a){ 
    char line[64]; 
    double value = 0; 
    int n = 0; 
    while ((fgets(line, sizeof line, stdin) != NULL) && (line[0] != '\n')){ 
     if (sscanf(line, "%lf", &value) == 1){ 
      a =(double*)malloc(sizeof(*a) *(n+1)); 
      a[n] = value; 
      printf("%lf",a[n]); 
      n = n++; 
     } 
     else { 
      break; 
     } 
    } 
    return a; 
} 
double *bekerdezo2(double *b){ 
    double value = 0; 
    char line[64]; 
    int n = 0; 
    while ((fgets(line, sizeof line, stdin) != NULL) && (line[0] != '\n')){ 
     if (sscanf(line, "%lf", &value) == 1){ 
      b = (double*)malloc(sizeof(*b) *(n+1)); 
      b[n] = value; 
      printf("%lf",b[n]); 
      n = n++; 
     } else { 
      break; 
     } 
    } 
    return b; 
} 

int main(void) 
{ 

double reszq = 0,vegosszeg=0, tarolo = 0; 
int i = 0; 
size_t *n = 0; 
double *a=NULL, *b = NULL; 

bekerdezo1(a); 
bekerdezo2(b); 

for(i=0;i<100; i++) 
{ 
    reszq = 0; 
    tarolo = (a[i])*(b[i]); 
    reszq = tarolo/a[i]; 
    vegosszeg = vegosszeg + reszq; 
} 
printf("vegosszeg=", vegosszeg); 


return 0; 
} 
+0

哎呀!沒有看到@pzaenger – Cherubim

回答

2

的main()您訪問的全局變量一個 & b。這些指針沒有正確分配。 在中分配的內存bekerdezo1() & bekerdezo2()被分配給局部變量,而不是全局變量。

bekerdezo2()然後返回局部變量回主,但從來沒有分配給全局變量b。另一方面返回全局變量b(我認爲這是一個錯誤,它真的應該返回本地變量a)。

在指針Ñbekerdezo2()接入然而存在其他錯誤。這個指針還沒有被正確地初始化/分配。

而且在for循環中的main()不檢查有多少元素被真正進入,但試圖從所有100

你也想驗證來讀取一個 & b包含相同數量的元素。或者至少只循環到其中一個讀取的最小nr。

我建議刪除所有的全局變量,並使它們的局部變量main()這將幫助你(和編譯器)找到這樣的錯誤。