我正在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. 初始化传递的指针以指向有效内存并传递后者的大小。
#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/