繁体   English   中英

不使用参数时的分段错误(核心转储)

[英]Segmentation fault (core dumped) when not using arguments

我可能会完全以错误的方式进行此操作,但是考虑到这样做只能供个人使用,如果效率不是可以的话。

当以./todo -r身份./todo -r ,它可以工作。

当以./todo -a身份./todo -a ,它可以工作。

当以./todo身份./todo ,它给了我segmentation fault (core dumped)

#include<stdio.h>
#include<stdlib.h>

int main(int argc, char *argv[]) {

    if(argc < 1) {
    printf("Not enough variables.");
    }

    if(strcmp("-r",argv[1])==0) {
        printf("\n");

        system("cat .todo");
        printf("\n");
    }
    if(strcmp("-a",argv[1])==0)   {
    char str[BUFSIZ];
    FILE *f;
    f = fopen(".todo","a");
    printf("\n\nTODO list\n\n");
    for(;;) {

        printf("~ ");
        fgets(str,256,stdin);
        if(strcmp(str,"\n")==0) {
            fclose(f);
            printf("\n");
            break;
        }

        fprintf(f,str);
        }
    return 0;
    }
}

argv[0]是程序可执行文件的名称,计入argc

因此./todo具有argc=1 ,但是argv[1]为NULL,这将导致strcmp()出现问题。

看到argv [argc] ==?

更改测试:

if (argc < 2) 
{
  printf("Not enough variables.");
  return 0; // do this, otherwise we'll plough straight on..
}

正如其他人指出的那样,您需要argc < 2而不是argc < 1

此外,您可能想从if返回,以阻止其余部分执行:

if(argc < 2) {
  printf("Not enough variables.");
  return /* some appropriate value here */;
}

您正在关闭文件句柄,然后仍尝试对其进行写入:

if (...) {
   fclose(...); <--potentially closing it, depending on the if() results
}
fprintf(...); <--potentially writing to a closed handle.

这是一个坏主意。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM