使用char数组时,C-fgets神秘地导致段错误

时间:2016-09-05 03:36:56

标签: c segmentation-fault fgets

我似乎对这个问题有类似的问题,但是我要以一种非常直接的方式提出问题,所以希望我可以很好地解释到底是怎么回事。

看看这个非常简单的程序:

int main()
{
    char* a;
    a[200];
    fgets(a, 200, stdin);

    char* b;
    b[200];
    fgets(b, 200, stdin); // Seg fault occurs once I press enter

    return 0;
};

正如您所看到的,' a'运行正常。但是部分' b' seg故障。发生了什么事?

1 个答案:

答案 0 :(得分:2)

嗯,这是基础知识。段错误意味着您正在使用无法访问它的内存。

int main()
{
    char* a; // Create a pointer (a pointer can only contains an address (int size)
    a[200]; // Trying to access to the byt 200 of your pointer but basicaly do nothing. You are suppose to have a segfault here

    fgets(a, 200, stdin); // store your stdin into &a (you may have a segfault here too)

    return 0;
};

根据许多事情,有时可能会失败,有时则不会。但你在这里做错了什么。 你必须解决这个问题。首先使用简单的数组char

#include <stdio.h> /* for stdin */
#include <stdlib.h> /* for malloc(3) */
#include <string.h> /* for strlen(3) */
#include <unistd.h> /* for write(2) */

int main()
{
     char str[200];
     fgets(str, sizeof str, stdin);

     write(1, str, strlen(str)); /* you can receive less than the 200 chars */

     return (0);
}

或者如果你想继续使用指针

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

int main()
{
     const size_t sz = 200;
     char* str;
     str = malloc(sz);

     fgets(str, sz, stdin);

     write(1, str, strlen(str));
}

但无论如何,你的错误是因为缺乏对C中指针和内存的了解。

祝你好运,