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