当我 运行 这段代码时,为什么会出现分段错误?
why am i getting segmentation fault when i run this code?
#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) 在线编译器
简单。在第 6 行中,您将 0 分配给 sum
,但总和不是实际总和,而是指向它的指针。当您尝试打印它时,您访问了无效内存。
编辑:
顺便说一句,如果您尝试使用 -fanalyzer,您将收到警告和解释。
https://godbolt.org/z/W6ehh8
double *sum;
这创建了一个指向 double
的指针,但它具有任意值,因此指向没有专用内存。
此外,在被调用的函数中,您将 sum
指针设置为零(空指针),然后尝试使用该指针取消引用内存 - 这是一个很大的 non-no。
我也会对 for(i=0; i<n-2; i++)
对数组中的值求和保持警惕。它不会包括最后两个,因为 n
是两个,这意味着它不会累积其中的 any。
正确的方法是:
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=%f\n", sum, avg);
return 0;
}
正如预期的那样,这给了你:
Sum=1.000000, Avg=0.500000
#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) 在线编译器
简单。在第 6 行中,您将 0 分配给 sum
,但总和不是实际总和,而是指向它的指针。当您尝试打印它时,您访问了无效内存。
编辑: 顺便说一句,如果您尝试使用 -fanalyzer,您将收到警告和解释。 https://godbolt.org/z/W6ehh8
double *sum;
这创建了一个指向 double
的指针,但它具有任意值,因此指向没有专用内存。
此外,在被调用的函数中,您将 sum
指针设置为零(空指针),然后尝试使用该指针取消引用内存 - 这是一个很大的 non-no。
我也会对 for(i=0; i<n-2; i++)
对数组中的值求和保持警惕。它不会包括最后两个,因为 n
是两个,这意味着它不会累积其中的 any。
正确的方法是:
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=%f\n", sum, avg);
return 0;
}
正如预期的那样,这给了你:
Sum=1.000000, Avg=0.500000