【问题标题】:Segmentation fault(core dumped) when printing pointer's information打印指针信息时出现分段错误(核心转储)
【发布时间】:2015-02-11 23:20:51
【问题描述】:

我正在读取我的输入并将其放入指针中。我用过malloc,所以不知道哪里错了

代码:

#define BUFFER 30 //in my .h file

char *inStr;
inStr = malloc(sizeof(char*)*BUFFER);
scanw("%s", &inStr);
inStr[strlen(inStr)] = '\0';
mvwprintw(stdscr, 0, 0, "%s",inStr);

我正在尝试将其输出到 ncurses 板上,但不确定为什么会发生这种情况。当我按 Enter 输入时它崩溃了

【问题讨论】:

  • 什么是buffer?它的内容是什么?你怎么知道malloc() 成功了? inStr 中放入了什么?为什么还要写inStr[strlen(inStr)] = '\0';
  • sizeof(char*)? BUFFER 是什么?
  • 你 malloc 了一些东西,好吧。您确定 char* 不应该是 char 吗?第四行似乎完全没用,因为 scanw 应该为您终止该字符串(如果它 没有,您认为 strlen 会如何工作?)。而这个:scanw("%s", &inStr); 应该是 scanw("%s", inStr);

标签: c string input ncurses


【解决方案1】:

第一项,对于“%s”格式,您需要传递一个指向缓冲区的指针。您实际上是在传递一个指向缓冲区指针的指针。删除 &。其次,strlen 是由结尾处的 null 定义的,因此使用它来确定将 null 放在哪里有点荒谬。相反,您必须信任 scanw 才能正确终止它。请注意,这是一个巨大的假设,并且是整个 scanf 系列受到缓冲区溢出困扰的重要原因 - 该函数不知道缓冲区有多大。此外,正如其他人指出的那样,您的 malloc 大小已关闭 - 您可能只想要 malloc(BUFFER) 之类的东西 - 注意 sizeof(char) 的定义为 1。

char *inStr;
inStr = malloc(BUFFER);
scanw("%s", inStr);
mvwprintw(stdscr, 0, 0, "%s",inStr);

【讨论】:

    【解决方案2】:

    改为:

    malloc(sizeof(char)*BUFFER)
    

    【讨论】:

      猜你喜欢
      • 2021-05-04
      • 2015-05-12
      • 2016-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-15
      相关资源
      最近更新 更多