C 在编译器正常运行代码后出现SEGFULT

C 在编译器正常运行代码后出现SEGFULT,c,C,所以我决定解决一些C语言书中的一个问题。处理了gcc编译器告诉我要处理的所有错误,所以现在程序编译没有错误。但是,当我运行executive时,在输入之后,它会显示“Segmentation fault”。这意味着什么?我如何修复它 我想这是因为我实现了离散函数来计算和,然后尝试在main()中编写代码。它工作正常,但仍然 我很好奇这个错误的原因是什么,为什么在我决定使用函数时会出现这个错误 #include<stdio.h> #include<stdlib.h> #in

所以我决定解决一些C语言书中的一个问题。处理了gcc编译器告诉我要处理的所有错误,所以现在程序编译没有错误。但是,当我运行executive时,在输入之后,它会显示“Segmentation fault”。这意味着什么?我如何修复它

我想这是因为我实现了离散函数来计算和,然后尝试在
main()
中编写代码。它工作正常,但仍然

我很好奇这个错误的原因是什么,为什么在我决定使用函数时会出现这个错误

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

double summation(long* N);

int main(void)
{
    printf("summation of squares of first N numbers\n");
    printf("enter N\n");
    long* N;
    *N = 0;

    scanf("%li\n",N);

    double su;
    su = summation(N);
    printf("The summ equals %.lf\n", su);
    return 0;
}

double summation(long* N)
{
    double S = 0;
    int i;

    for (i = 1; i <= *N; i++)
        S = S + pow(i, 2);
    return S;
}
#包括
#包括
#包括
二次求和(长*N);
内部主(空)
{
printf(“前N个数字的平方和\N”);
printf(“输入N\N”);
长*N;
*N=0;
scanf(“%li\n”,n);
双素;
su=总和(N);
printf(“总和等于%.lf\n”,su);
返回0;
}
双重求和(长*N)
{
双S=0;
int i;
对于(i=1;i而言,问题在于:

long* N;          // N points nowhere
*N = 0;           // you deferecence a pointer that points nowhere
                  // which most likely will result in a segfault
scanf("%li\n", N);
这是正确的:

long N;
N = 0;            // this line is somewhat useless BTW, because
                  // N will be modified in the line below anyway
scanf("%li\n", &N);
...
su = summation(&N);
或者更好:

su = summation(N);
...

double summation(long N)   // no need to pass the pointer to N
{                          // just pass N
  double S = 0;
  int i;

  for (i = 1; i <= N; i++)
    S = S + pow(i, 2);
  return S;
}
su=总和(N);
...
双重求和(长N)//无需将指针传递到N
{//只要通过N
双S=0;
int i;
对于(i=1;i而言,问题在于:

long* N;          // N points nowhere
*N = 0;           // you deferecence a pointer that points nowhere
                  // which most likely will result in a segfault
scanf("%li\n", N);
这是正确的:

long N;
N = 0;            // this line is somewhat useless BTW, because
                  // N will be modified in the line below anyway
scanf("%li\n", &N);
...
su = summation(&N);
或者更好:

su = summation(N);
...

double summation(long N)   // no need to pass the pointer to N
{                          // just pass N
  double S = 0;
  int i;

  for (i = 1; i <= N; i++)
    S = S + pow(i, 2);
  return S;
}
su=总和(N);
...
双重求和(长N)//无需将指针传递到N
{//只要通过N
双S=0;
int i;

对于(i=1;i)它表示“未定义的行为”代码中的某个地方。编译器接受语法正确的C程序,这决不能保证程序是正确的。顺便说一句,
*N=0;
是罪魁祸首,
N
不指向可用的
long
变量,它只是一个未初始化的指针。您正在尝试写入某个“随机”变量可能根本不存在的位置。为什么要使用
long*
呢?将N声明为
long
,并使用地址运算符(
scanf(…,&N);
@Ctx删除星号并使scanf&N生效,问题就消失了。但为什么呢?如果我使用“int*j”;然后只使用i,这与我定义“inti”然后使用地址运算符&j不一样吗?它的意思是“未定义的行为”代码中的某个地方。编译器接受语法正确的C程序,这决不能保证程序是正确的。顺便说一句,
*N=0;
是罪魁祸首,
N
不指向可用的
long
变量,它只是一个未初始化的指针。您正在尝试写入某个“随机”变量可能根本不存在的位置。为什么要使用
long*
呢?将N声明为
long
,并使用地址运算符(
scanf(…,&N);
@Ctx删除星号并使scanf&N生效,问题就消失了。但为什么呢?如果我使用“int*j”;然后只使用i,这与定义“int i”不一样吗然后使用地址运算符&j?为什么第二个选项更好?为什么要传递var,而不是var的地址?@Arman让我们说它更直截了当。@Arman对于一个简单的问题使用一个简单的解决方案,因此使用指针只会使求和复杂化。因此,我可以在下面删除行
N=0;
或键入
long N=0;
坚持我立即更改值。但有人告诉我,我需要初始化每个值。正如我所理解的,我需要在定义这个值后立即给任何变量赋予一些值。我是对的吗?@Arman嗯,不完全正确。初始化变量是一个好的做法,但是
N
将由
scanf
an修改当然,您不需要预先初始化
N
,但这也没有什么坏处。简单的例子:
intx;…;x=foo*bar;
就可以了,您不需要在声明时初始化
x
,因为它将由以下语句赋值:
x=foo*bar;
。为什么第二个选项更好?为什么要传递var,而不是var的地址?@Arman让我们说它更直截了当。@Arman对于一个简单的问题使用一个简单的解决方案,因此使用指针只会使求和复杂化。因此,我可以删除行
N=0;
或键入
long N=0;
,我知道我会立即更改该值。但有人告诉我,我需要初始化每个值。正如我所理解的,我需要在定义这个值时给任何变量赋予一些值。我说得对吗?@Arman嗯,不太对。初始化变量是一个很好的做法,但由于
N
将被
scanf
修改,无论如何,你不需要事先初始化
N
,但这也不会有什么害处。简单示例:
int x;…;x=foo*bar;
是可以的,您不需要在声明时初始化
x
,因为它将由以下语句分配:
x=foo*bar;