繁体   English   中英

C-fgets在使用char数组时神秘地导致segfault

[英]C - fgets mysteriously causes segfault when using char arrays

我似乎已经对此问题提出了类似的问题,但是我以一种非常直接的方式询问,因此希望我能对到底发生了什么有个很好的解释。

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

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”段存在故障。 到底是怎么回事?

好吧,这是这里的基础。 segfault意味着您正在使用您无权访问的内存。

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语言中的指针和内存缺乏了解导致的。

祝你好运

暂无
暂无

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

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