c - 使用 getline 后出现段错误

标签 c segmentation-fault getline

我正在Linux上学习C,并且在终端上做了一个小游戏。一切正常,直到添加了一个在开始时询问玩家昵称的功能。

当我启动该程序然后输入它时,我得到一个 段错误(核心转储)

这是一个最小的错误再现:

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

int main (void) {
  bool condition = true;
  char *buffer;
  char *pseudo;
  size_t characters;
  size_t bufsize = 32;

  characters = getline(&buffer, &bufsize, stdin);
  pseudo = buffer; // make pseudo points to input obtained  
  // after this I have Segmentation fault (core dumped)
      
  while (condition == true) {
    // do something with pseudo
  }
  return(0);
}

最佳答案

getline()可以以两种不同方式使用:

  1. 读入调用者提供的缓冲区。
  2. 读取时分配内存。

使用方法 1. 初始化传递的指针以指向有效内存并传递后者的大小。

#define INITIAL_SIZE (42)

int main(void)
{  
  char * buffer = malloc(INITIAL_SIZE * sizeof *buffer);
  size_t bufsize = INITIAL_SIZE;
  ssize_t characters = getline(&buffer, &bufsize, stdin);
  if (-1 == characters)
  {
     /* handle error. */
  }
  else
  {
     /* use buffer */
  }

  free(buffer); /* Free buffer. */
}

使用2.初始化传递给NULL的指针并传递0作为大小。

int main(void)
{
  char * buffer = NULL;
  size_t bufsize = 0;
  ssize_t characters = getline(&buffer, &bufsize, stdin);
  if (-1 == characters)
  {
     /* handle error. */
  }
  else
  {
     /* use buffer */
  }

  free(buffer); /* Free buffer. */
}

注意:getline() 返回 ssize_t 而不是 size_t

关于c - 使用 getline 后出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54266432/

相关文章:

c++ - 从输入读取字符串直到 EOF

C - 尝试确定由 getline() 填充的缓冲区中的元素数

java - 为什么在大多数实时应用程序中首选 c 而不是 java

c - 如果 stdio 是跨平台 C/C 标准库抽象

c - 是否允许编译器优化 realloc?

C++:当我添加看似无关的代码行时,段错误消失了

c - 程序在将 int 转换为 double 时终止。无法弄清楚为什么会出现段错误

c - 在线程不安全函数上使用锁定和复制

c - 在 C 中使用 sprintf 时出现段错误

c++ - 使用 getline 忽略用户输入中的制表符和换行符