指针错误?访问违反内存读取

时间:2015-12-08 19:53:34

标签: c

我必须帮助我的一个朋友,但我忘记了一点C.:\那个代码的问题是什么?必须有一些指针错误。它给了我违反阅读记忆的Access。可能是什么问题呢?主要任务是:2个无限阵列,并且必须计算一个avarge。

编辑版:阅读没问题,但可以很好地传递。我记得我不应该返回一个指针,我可以返回一个计数器来计算连接到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;
}

1 个答案:

答案 0 :(得分:2)

main()中,您可以访问全局变量 a &amp; B'/ em>的。这些指针尚未正确分配。 bekerdezo1()&amp;中分配的内存 bekerdezo2()分配给局部变量,而不是全局变量。

bekerdezo2()然后将局部变量返回给main,但从未分配给全局变量 b 。 另一方面, bekerdezo1()返回全局变量 b (我认为这是一个错误,它应该返回本地变量 a )。

bekerdezo2()中指针 n 的访问中存在另一个错误。该指针尚未正确初始化/分配。

main()中的for循环也不会检查实际输入了多少元素,但尝试从所有100个元素中读取。

您还需要验证 a &amp; b 包含相同数量的元素。或者至少只循环直到其中一个读取的最小nr。

我建议删除所有全局变量,并使它们成为 main()的局部变量,这将帮助您(和编译器)找到这样的错误。