从命令行读取参数时出现分段错误

时间:2013-04-16 06:28:40

标签: c segmentation-fault

我正在尝试在c中实现重复的cat函数。我遇到了分段错误,我无法找到原因。

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




int main(int argc,char *argv[])
{
    char* s;        /* input string */

    int c;

    if(argc==1){


        while (gets(s)){
            puts(s);
        }
    }

    else{

    FILE *file = fopen( "./argv[1]", "r" );
    while((c=fgetc(file))!=EOF){
        fputc(c,stdout);

    }

    fclose(file);   

    }


    return 0;
}

4 个答案:

答案 0 :(得分:5)

您正在将字符读入s而不分配内存:

    while (gets(s)){
        puts(s);
    }

首先使用malloc分配一些内存(稍后您需要free):

    char *s = malloc(some_buffer_size);

或修复它:

    char s[some_buffer_size];

顺便说一下,请注意gets,因为无法限制输入的字符数,这可能导致缓冲区溢出。请改用fgets(buf, sizeof(buf), stdin)

其他人已经指出了第二个错误,你不能这样称呼fopen,改用它,或者使用H2CO3的解决方案:

 FILE *file = fopen( argv[1], "r" );

答案 1 :(得分:1)

gets(s); - 此处s未初始化为指向任何内容。 fopen( "./argv[1]", "r" ); - 这是错的。必须是 - fopen(argv[1], "r" );

答案 2 :(得分:0)

fopen( "./argv[1]", "r" );
嗯,什么?假设,对吧?

char buf[0x1000];
snprintf(buf, sizeof(buf), "./%s", argv[1]);
FILE *f = fopen(buf, "r");

此外,您正在使用未初始化的s指针(您没有为其分配任何内存),因此您的程序也会调用未定义的行为。

答案 3 :(得分:0)

malloc()基本上分配内存。最后,您还需要free()您的变量以释放分配的空间。

您应该使用gdb()来查找错误并调试程序。