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