fgets在gdb下遇到分段错误,但在正常运行时却没有

Joh*_*ers 2 c pointers segmentation-fault

以下程序(什么都不做)运行正常.

#include <stdio.h>

int main(int argc, char *argv[])
{
  char *current_string = NULL;
  fgets(current_string, 16, stdin);

  return(0);
}
Run Code Online (Sandbox Code Playgroud)

但是,当我在GDB下运行它时,该fgets调用会触发分段错误.

Program received signal SIGSEGV, Segmentation fault.
0x000000332ec67ee0 in _IO_getline_info_internal () from /lib64/libc.so.6
Missing separate debuginfos, use: debuginfo-install glibc-2.12-1.149.el6_6.9.x86_64
(gdb) backtrace
#0  0x000000332ec67ee0 in _IO_getline_info_internal () from /lib64/libc.so.6
#1  0x000000332ec66d29 in fgets () from /lib64/libc.so.6
#2  0x0000000000400536 in main (argc=1, argv=0x7fffffffd4e8) at test.c:7
Run Code Online (Sandbox Code Playgroud)

据我所知,我一直在关注该fgets函数的正确用法,我不明白发生了什么.我做错了什么?

我正在用gcc编译-gRHEL上的选项(用于调试信息).

Sou*_*osh 6

在你的代码中,

  fgets(current_string, 16, stdin);
Run Code Online (Sandbox Code Playgroud)

current_string初始化为NULL,所以基本上你试图写入无效的指针.它调用未定义的行为.

您需要先分配内存,current_string然后才能实际向其中写入内容(确切地说,指向它所指向的内存位置).

相反,根据这个片段,我没有看到current_string用作指针的理由.你可以轻松地写出类似的东西

 #define MAX 16

char current_string[MAX] = {0};
fgets(current_string, MAX, stdin);
Run Code Online (Sandbox Code Playgroud)

并使其工作.