【问题标题】:What's causing segmentation fault in my code and how do I fix it? [closed]是什么导致我的代码出现分段错误,我该如何解决? [关闭]
【发布时间】:2021-11-14 18:26:18
【问题描述】:

该程序应该将两个整数相乘并打印相乘的结果。 如果程序没有收到 2 个参数,它应该打印 Error 并返回 1。

我用

编译它

当我用 <. int> 或 <. int> 运行它时,它会输出正确的结果,但是当我只用 <.> 运行它时,它会说 分段错误 我希望它会输出错误。 我的代码如下。提前致谢

#include <stdio.h>
#include <stdlib.h>

int main (int argc, char *argv[])
{
  int x = atoi(argv[1]);
  int y = atoi(argv[2]);

if (argc == 3)
   {
       printf("%d\n", x * y);
   }
else
   { 
       printf("Error\n");
       return 1;
    }

return 0;
}

【问题讨论】:

  • if (argc == 3) 在访问argv 值之前检查,就像上面两行所做的那样。
  • int x = atoi(argv[1]);int y = atoi(argv[2]); 缺少分号 ;
  • **argv*argv[] 是获取主函数参数的正确方法。
  • 将警告级别提高到最大,并更正您的代码,直到没有警告为止。
  • 段错误?它甚至无法编译 4 个警告和 2 个错误 (MSVC)。请复制/粘贴确切的代码。

标签: c segmentation-fault return


【解决方案1】:

你想要这个:

int main(int argc, char* argv[]) // char* argv[] here
{
  if (argc != 3)                // test argc *before* dereferencing argv[1] and argv[2]
  {
    printf("Error\n");
    return 1;
  }

  int x = atoi(argv[1]);
  int y = atoi(argv[2]);
  printf("%d\n", x * y);  
  return 0;
}

您正在取消引用 argv[1]argv[2] 测试 argc 是否为 3。指令按顺序执行。如果在命令行上执行不带参数的程序,argc 将为 1,argv[1] 超出范围,因此会出现 seg 错误。

而且main的签名不对,应该是int main (int argc, char *argv[])main 的第二个参数是一个指向 char 的指针数组。

【讨论】:

  • 或者更好的是:int x = strtol(argv[1], NULL, 10);。永远不要使用atoi
猜你喜欢
  • 1970-01-01
  • 2019-10-05
  • 1970-01-01
  • 2023-03-08
  • 2020-04-22
  • 1970-01-01
  • 2022-07-26
  • 2021-11-23
  • 2019-08-28
相关资源
最近更新 更多