c-为什么我运行这个代码时会出现分段错误


#include <stdio.h>
void avg_sum(double a[], int n, double *avg, double *sum)
{
int i;
sum = 0;
printf("%f", *sum);
for(i=0; i<n; i++)
*sum += a[i];
*avg = *sum/n;
}

int main()
{
double arr[2] = {0.0,1.0};
double *sum;
double *avg;
int n = 2;
avg_sum(arr, n, avg, sum);
printf("...Done...n");

return 0;
}

尝试使用两个GCC(https://www.tutorialspoint.com/compile_c_online.php)和clang(来自repl.it(在线编译器

double *sum;

这创建了一个指向double的指针,但它具有任意值,因此不指向专用内存。

此外,在被调用的函数中,将sum指针设置为零(空指针(,然后尝试使用该指针去引用内存——这是一个很大的非零。

我也会注意for(i=0; i<n-2; i++)对数组中的值求和。它不包括最后两个,因为n是两个,这意味着它不会累积其中的任何

正确的方法是:

void avg_sum(double a[], int n, double *avg, double *sum) {
int i;
*sum = 0;               // set content, not pointer.
for(i=0; i<n; i++)      // do all elements.
*sum += *(a+i);
*avg = *sum/n;
}
int main(void) {
double arr[2] = {0.0,1.0};
double sum;                  // ensure actual storage
double avg;                  // and here
int n = 2;
avg_sum(arr, n, &avg, &sum); // then pass pointers to actual storage
printf("Sum=%f, Avg=%fn", sum, avg);

return 0;
}

正如预期的那样,这将为您提供:

Sum=1.000000, Avg=0.500000

简单。在第6行中,您将0分配给sum,但sum不是实际的sum,而是指向它的指针。当您尝试打印它时,您访问了无效内存。

编辑:顺便说一句,如果你试图遵守-fanalyzer,你会得到警告和解释。https://godbolt.org/z/W6ehh8

相关内容

  • 没有找到相关文章

最新更新