【问题标题】:Segmentation fault at ././ 处的分段错误
【发布时间】:2021-03-03 12:12:49
【问题描述】:

我对 C 比较陌生,我开始使用线程和命令行;我只需要一些调试和错误处理方面的帮助。每次尝试处理代码时,我都会遇到分段错误。如果有argv[1] 的参数,它可以正常工作。但是,当尝试捕获任何错误时,例如只输入“./example”而不输入其他内容时,它会发现分段错误。

我尝试了以下代码的变体但无济于事,包括查看argc < 1

int main(int argc, char * argv[]){
   pthread_t worker1;
   int in;
   
   if(arv[1] == NULL){
      printf("ERROR HERE");
   }else{
      in = strtol(argv[1], &endptr, 10);
   }

   if(*endptr > in || *endptr == in){
      printf("please eneter a number larger than zero");
      return EXIT_FAILURE;
   }else{
      pthread_create(&worker1, NULL, worker, &in);
      pthread_join(worker1, NULL);
   }
   return EXIT_SUCCESS;
}

下面是我正在使用的当前代码,我很确定这是我忽略的小东西。我以前从未使用过strtol,并且以前使用过atoi,我听说这样做是更好的做法。我比较确定错误出现在提供的代码中,因为当我测试线程函数时,它工作正常;如果需要更多,请告诉我!

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <time.h>

int main(int argc, char * argv[]){
   pthread_t worker1;
   int in = strtol(argv[1], &endptr, 10);

   if(*endptr > in || *endptr == in){
      printf("please eneter a number larger than zero");
      return EXIT_FAILURE;
   }else{
      pthread_create(&worker1, NULL, worker, &in);
      pthread_join(worker1, NULL);
   }
   return EXIT_SUCCESS;
}

【问题讨论】:

  • 当没有命令行参数时,您究竟希望strtol(argv[1], &amp;endptr, 10) 做什么? argv[1] 则不是有效的字符串。 argc 告诉你argv 有多少个有效元素,这样你就可以避免这样的问题。
  • 查看 argc 是否 。它永远不会小于 1,因为程序名称是按惯例传入的第一个 arg。试试&lt; 2
  • @johnBollinger 老实说,这对我自己来说是一个相对较新的语法,我假设如果 argv[1] 为空,它将返回 NULL 或类似的东西(因此第一部分代码)。就像我说的,我可能完全忽略了这里的一些东西,因为我对 strtol 语法不是 100% 确定。
  • 嗯,是的,当没有命令行参数时,argv[1](但不一定是argv[2])包含一个空指针。那么我想问题是你期望strtol(NULL, &amp;endptr, 10) 做什么,当一个空指针,根据定义,不指向任何东西。
  • 一些建议:当您尝试argc &lt; 1 并且它不起作用时,听起来您在不理解它为什么不起作用的情况下放弃了它。相反,您应该调试它(正如您应该为任何其他意外行为所做的那样)。调试器就是为此而生的工具。您可以在调试器中运行它,然后查看为什么您的情况没有像您预期的那样发现问题。

标签: c segmentation-fault


【解决方案1】:

您正在尝试访问一个数组而不首先进行任何类型的边界检查:

int main(int argc, char * argv[]){
   pthread_t worker1;
   int in = strtol(argv[1], &endptr, 10);
...

谁说argv[1] 存在?当然不是您的程序,因为它不会首先检查该条件。添加对 argc 的检查,以确保在尝试使用它们之前获得预期的参数数量。

  if (argc > 1) {
    int in = strtol(argv[1], &endptr, 10);
  }

【讨论】:

    猜你喜欢
    • 2018-11-18
    • 1970-01-01
    • 2021-10-22
    • 2018-04-30
    • 2020-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多