c - fgets 在 gdb 下遇到段错误,但在正常运行时不会遇到

标签 c pointers segmentation-fault

以下程序(什么都不做)运行良好。

#include <stdio.h>

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

  return(0);
}

但是,当我在 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

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

我在 RHEL 上使用带有 -g 选项(用于调试信息)的 gcc 进行编译。

最佳答案

在你的代码中,

  fgets(current_string, 16, stdin);

current_string 被初始化为 NULL,所以本质上你是在尝试写入一个无效的指针。它调用 undefined behaviour .

您需要为 current_string 分配内存,然后才能真正写入一些内容(写入它指向的内存位置,即准确)。

相反,根据这个 片段,我看不出有理由使用current_string 作为指针。你可以很容易地写出类似的东西

 #define MAX 16

char current_string[MAX] = {0};
fgets(current_string, MAX, stdin);

并让它发挥作用。

关于c - fgets 在 gdb 下遇到段错误,但在正常运行时不会遇到,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31789617/

相关文章:

c++ - 如何在不指定 C++ 中的所有参数的情况下声明程序的 main() 入口点?

c - 传递 ‘strstr’ 的参数 2 可以使指针来自整数而无需强制转换吗?

c - 段错误字符** C

c - 运行固件需要引导加载程序吗?

c - C中括号中两个值的赋值

c - 为什么 main char **argv 的参数是 c 中的字符串数组

c - C 中的免费通用链表 - 段错误

gcc - 如何使用用于 armv5tel 的 GNU 自动工具进行交叉编译?

c - C(Windows) 中 printf(0) 的安全隐患

c - 如何在 C 中浏览任意长度的字符串数组?