C SIGSEGV内存访问冲突

C SIGSEGV内存访问冲突,c,memory,access-violation,segmentation-fault,C,Memory,Access Violation,Segmentation Fault,我正在用C写一个学校项目,显然这段代码中的某些东西导致它崩溃,并出现SIGSEGV内存访问冲突错误,即使它编译时没有任何问题 int P, H, S, R; char *end; if (argc != 5){ printf("Incorrect ammount of parameters.\n"); exit(1); } errno = 0; P=strtod(argv[2],&end); H=strtod(argv[3],&end); S=strtod(a

我正在用C写一个学校项目,显然这段代码中的某些东西导致它崩溃,并出现SIGSEGV内存访问冲突错误,即使它编译时没有任何问题

int P, H, S, R;
char *end;

if (argc != 5){
    printf("Incorrect ammount of parameters.\n");
    exit(1);
}

errno = 0;
P=strtod(argv[2],&end);
H=strtod(argv[3],&end);
S=strtod(argv[4],&end);
R=strtod(argv[5],&end);

if (errno != 0){
    printf("Wrong input: %s\n",strerror(errno));
    exit(1);
}

//I know have only integers in P,H,S,R, that's why I can afford to do the following. Please don't judge me.
if ((H < 0) || (S < 0) || (R < 0) || (H > 5000) || ( S > 5000) || ( R > 5000)){
    printf("Incorrect waiting time H,S,R >= 0 && H,S,R < 5001\n");
    exit(1);
}

if ((P < 1) || ((P % 2)==1)){
    printf("Must be even number bigger than 0.");
    exit(1);
}
问题在于:

if (argc != 5)
…
R=strtod(argv[5],&end);
R=strtod(argv[5],&end);
argc==5
时,
argv[5]==NULL
。转换空指针时会崩溃。您应该通过
argv[4]
argv[1]
上使用
strod()。使用
strod()
将字符串转换为整数是不常见的;通常,您会使用strtol()
或其亲属之一。

问题在于:

if (argc != 5)
…
R=strtod(argv[5],&end);
R=strtod(argv[5],&end);
argc==5
时,
argv[5]==NULL
。转换空指针时会崩溃。您应该通过
argv[4]
argv[1]
上使用
strod()。使用
strod()
将字符串转换为整数是不常见的;通常,您会使用strtol()
或其亲属之一。

问题在于:

if (argc != 5)
…
R=strtod(argv[5],&end);
R=strtod(argv[5],&end);
argc==5
时,
argv[5]==NULL
。转换空指针时会崩溃。您应该通过
argv[4]
argv[1]
上使用
strod()。使用
strod()
将字符串转换为整数是不常见的;通常,您会使用strtol()
或其亲属之一。

问题在于:

if (argc != 5)
…
R=strtod(argv[5],&end);
R=strtod(argv[5],&end);

argc==5
时,
argv[5]==NULL
。转换空指针时会崩溃。您应该通过
argv[4]
argv[1]
上使用
strod()。使用
strod()
将字符串转换为整数是不常见的;通常,您会使用strtol()
或它的一个亲戚。

如果您能追踪到错误发生的确切位置,那就最好了。您可以在调试器中执行此操作,或者只需将
printf
语句放在各处,然后查看最后一个有效的语句是什么

然而,从一个简单的角度来看,我认为问题在于:

if (argc != 5)
…
R=strtod(argv[5],&end);
R=strtod(argv[5],&end);

SIGSEGV(分段错误)表示您尝试了无效的内存访问。几行之后,您检查了
argc==5
。这意味着
argv
的有效索引为0到4。没有
argv[5]
,任何试图读取它的行为都会导致未定义的行为。

如果您能追踪到错误发生的确切位置,那就最好了。您可以在调试器中执行此操作,或者只需将
printf
语句放在各处,然后查看最后一个有效的语句是什么

然而,从一个简单的角度来看,我认为问题在于:

if (argc != 5)
…
R=strtod(argv[5],&end);
R=strtod(argv[5],&end);

SIGSEGV(分段错误)表示您尝试了无效的内存访问。几行之后,您检查了
argc==5
。这意味着
argv
的有效索引为0到4。没有
argv[5]
,任何试图读取它的行为都会导致未定义的行为。

如果您能追踪到错误发生的确切位置,那就最好了。您可以在调试器中执行此操作,或者只需将
printf
语句放在各处,然后查看最后一个有效的语句是什么

然而,从一个简单的角度来看,我认为问题在于:

if (argc != 5)
…
R=strtod(argv[5],&end);
R=strtod(argv[5],&end);

SIGSEGV(分段错误)表示您尝试了无效的内存访问。几行之后,您检查了
argc==5
。这意味着
argv
的有效索引为0到4。没有
argv[5]
,任何试图读取它的行为都会导致未定义的行为。

如果您能追踪到错误发生的确切位置,那就最好了。您可以在调试器中执行此操作,或者只需将
printf
语句放在各处,然后查看最后一个有效的语句是什么

然而,从一个简单的角度来看,我认为问题在于:

if (argc != 5)
…
R=strtod(argv[5],&end);
R=strtod(argv[5],&end);


SIGSEGV(分段错误)表示您尝试了无效的内存访问。几行之后,您检查了
argc==5
。这意味着
argv
的有效索引为0到4。没有
argv[5]
,任何试图读取它的行为都会导致未定义的行为。

好的,您没有经验,很好。谷歌“调试器”并找到一个适用于您的流程的调试器。使用它来缩小或解决您的问题。显然,并不是所有的代码都显示出来,所以我们只能推测。。。为什么不自己调试一下,看看它在哪一行崩溃?顺便说一句,它被称为分段错误注意,您有一个条件来确保argc为5,并且您正在访问argv[5]索引(这将需要argc==6)。@Cool\u Coder:
SIGSEGV
指的是“分段冲突。注意”V“@alk谢谢你的指点。我现在也许需要睡一会儿。好吧,你没有经验,很好。谷歌“调试器”并找到一个适用于您的流程的调试器。使用它来缩小或解决您的问题。显然,并不是所有的代码都显示出来,所以我们只能推测。。。为什么不自己调试一下,看看它在哪一行崩溃?顺便说一句,它被称为分段错误注意,您有一个条件来确保argc为5,并且您正在访问argv[5]索引(这将需要argc==6)。@Cool\u Coder:
SIGSEGV
指的是“分段冲突。注意”V“@alk谢谢你的指点。我现在也许需要睡一会儿。好吧,你没有经验,很好。谷歌“调试器”并找到一个适用于您的流程的调试器。使用它来缩小或解决您的问题。显然,并不是所有的代码都显示出来,所以我们只能推测。。。为什么不自己调试一下,看看它在哪一行崩溃?顺便说一句,它被称为分段错误注意,您有一个条件来确保argc为5,并且您正在访问argv[5]索引(需要argc==6)。@Cool\u Coder:
SIGSEGV
指的是“分段冲突。注意“V”。@alk谢谢您的指点。我现在可能需要一些睡眠。好的,您没有经验,