为什么当我发送标志 -h 或 -H 时会出现分段错误。
bool parse_command(int argc, char **argv, bool *header, char **fileName)
{
if (!argv)
return false;
bool *flagh = false;
bool *flagH = false;
char *options = "Hh";
int opt = 0;
while ( (opt = getopt(argc, argv, options ) ) != -1)
{
printf("HELLO");
switch (opt)
{
case 'h':
*flagh = true;
break;
case 'H':
*flagH = true;
break;
default:
usage_p1();
return false;
}
}
printf("%d", opt);
// Implement this function
return true;
}
这两行是你的问题:
bool *flagh = false;
bool *flagH = false;
您声明flagh
和flagH
为指向布尔值的指针,但它们尚未指向任何地方。 事实上,它们明确地无处可去,因为您的初始化等效于
bool *flagh = NULL;
bool *flagH = NULL;
您可能不希望这些是指针。 将声明更改为
bool flagh = false;
bool flagH = false;
将分配更改为
flagh = true;
flagH = true;
看看这个:
bool *flagh = false;
bool *flagH = false;
这两个变量都是指针,您可以使用 false
初始化它们。没有 true
或false
C 语言,相反,当它被认为是false
计算结果为 0,当某些内容未false
时,它被认为是true
的。
如果这是真正的 C 代码,那么它与 do
相同bool *flagh = NULL;
bool *flagH = NULL;
以后你做
*flagh = true;
这是取消引用NULL
指针,该指针未定义并将导致段错误。
要修复代码,请执行以下操作:
#include <stdbool.h>
bool flagh = false;
bool flagH = false;
然后迟到了
flagh = true;
flagH = true;
// or
flagh = false;
flagH = false;
就像许多人在评论中所说的那样,C 没有真正的布尔类型。请参阅:在 C 中使用布尔值
编辑
如今,有stdbool.h
声明了bool
型和true
和 false
,但所做的只是将true
重新定义为 1,将false
重新定义为 0:
Stdbool.h
#ifndef _STDBOOL_H #define _STDBOOL_H #ifndef __cplusplus #define bool _Bool #define true 1 #define false 0 #else /* __cplusplus */ /* Supporting _Bool in C++ is a GCC extension. */ #define _Bool bool #if __cplusplus < 201103L /* Defining these macros in C++98 is a GCC extension. */ #define bool bool #define false false #define true true #endif #endif /* __cplusplus */ /* Signal that all the definitions are present. */ #define __bool_true_false_are_defined 1 #endif /* stdbool.h */