【问题标题】:why am i getting segmentation fault when i run this code?为什么我在运行此代码时会出现分段错误?
【发布时间】:2020-12-15 11:16:37
【问题描述】:
#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(from repl.it) 在线编译器

【问题讨论】:

  • 指针是指向其他变量的变量。 sum 指向哪个变量?

标签: c pointers gcc segmentation-fault


【解决方案1】:

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

编辑: 顺便说一句,如果您尝试使用 -fanalyzer,您将收到警告和解释。 https://godbolt.org/z/W6ehh8

【讨论】:

  • 我把它改成了 *sum = 0;并按照@paxdiablo 的说法更改了 main (),现在它可以工作了:),谢谢
  • @PlutonianFairy 作为感激之情,您可以接受 paxdiablo 的回答。 :)
【解决方案2】:
double *sum;

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

此外,在被调用的函数中,您将 sum 指针设置为零(空指针),然后尝试使用该指针来取消引用内存 - 这是一个很大的问题。

我也会警惕 for(i=0; i&lt;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=%f\n", sum, avg);
    
    return 0;
}

正如预期的那样,这给了你:

Sum=1.000000, Avg=0.500000

【讨论】:

  • 仍然出现分段错误... :(
  • @PlutonianFairy:那么您还没有按照我的建议进行所有更正。新代码运行良好,最终输出行来自它的实际运行。
  • 在更改 sum = 0 时起作用;到 *总和 = 0;更改主循环后,谢谢
猜你喜欢
  • 2022-07-01
  • 1970-01-01
  • 2021-07-30
  • 1970-01-01
  • 2023-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多