我对C
比较陌生,我开始使用线程和命令行;我只需要一些调试和错误处理方面的帮助。每次尝试处理代码时,我都会遇到分段错误。如果argv[1]
有一个参数,它就可以正常工作。然而,当试图捕捉任何错误时,例如只输入"/示例";除此之外,它发现了一个分割错误。
我尝试了以下代码的变体,但没有成功,包括查看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);
}