分段错误(核心已转储)- C 参数
Segmentation Fault (Core Dumped) - C Arguments
每次我运行下面的程序都是这样:./a.out -a -b
它运行正确。但是如果选择 运行 ./a.out -a
,我会导致分段错误(核心转储)。有什么办法可以解决这个问题吗?
int main(int argc, char *argv[])
{
if (argc > 1)
{
if (strcmp(argv[1],"-a") == 0)
{...
if (strcmp(argv[2],"-b") == 0)
{...}
}
}
}
当你运行它与./a.out -a
,只有一个参数时,那么你不应该做检查strcmp(argv[2],"-b")
,因为没有第三个参数,并且读取argv[2]
会导致未定义的行为。
您可以通过在执行 strcmp(argv[2],"-b")
之前添加额外的检查来修复它。
int main(int argc, char *argv[])
{
if (argc > 1)
{
if (strcmp(argv[1],"-a") == 0)
{...
if (argc > 2 && strcmp(argv[2],"-b") == 0)
{...}
}
}
}
这看起来很丑陋,但它可以工作。
argc 计算所有参数,包括程序名称。
如果您不提供 -b 参数,则 argc 等于 2
每次我运行下面的程序都是这样:./a.out -a -b
它运行正确。但是如果选择 运行 ./a.out -a
,我会导致分段错误(核心转储)。有什么办法可以解决这个问题吗?
int main(int argc, char *argv[])
{
if (argc > 1)
{
if (strcmp(argv[1],"-a") == 0)
{...
if (strcmp(argv[2],"-b") == 0)
{...}
}
}
}
当你运行它与./a.out -a
,只有一个参数时,那么你不应该做检查strcmp(argv[2],"-b")
,因为没有第三个参数,并且读取argv[2]
会导致未定义的行为。
您可以通过在执行 strcmp(argv[2],"-b")
之前添加额外的检查来修复它。
int main(int argc, char *argv[])
{
if (argc > 1)
{
if (strcmp(argv[1],"-a") == 0)
{...
if (argc > 2 && strcmp(argv[2],"-b") == 0)
{...}
}
}
}
这看起来很丑陋,但它可以工作。
argc 计算所有参数,包括程序名称。 如果您不提供 -b 参数,则 argc 等于 2