./ 处的分段错误

Segmentation fault at ./

我是 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;
}

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

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);
  }