C语言 为什么我在运行此功能时会出现分段错误



为什么当我发送标志 -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;

您声明flaghflagH为指向布尔值的指针,但它们尚未指向任何地方。 事实上,它们明确地无处可去,因为您的初始化等效于

bool *flagh = NULL;
bool *flagH = NULL;

您可能不希望这些是指针。 将声明更改为

bool flagh = false;
bool flagH = false;

将分配更改为

flagh = true; 
flagH = true; 

看看这个:

bool *flagh = false;
bool *flagH = false;

这两个变量都是指针,您可以使用 false 初始化它们。没有 truefalse 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型和truefalse,但所做的只是将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 */

相关内容

  • 没有找到相关文章

最新更新