首页 > 解决方案 > ./ 处的分段错误

问题描述

我比较陌生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;
}

标签: csegmentation-fault

解决方案


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

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

推荐阅读