在atoi(str)的Segfault

时间:2009-12-20 19:23:26

标签: c++ segmentation-fault atoi

我是C / C ++游戏的新手,所以我假设我犯了一个菜鸟错误:

int main(){
  char* clen;
  clen = getenv("CONTENT_LENGTH");
  if (clen==NULL){
    cout << "No such ENV var: CONTENT_LENGTH"<<endl;
    exit(0);
  }
  int cl = 0; 
  cl = atoi(clen);
  if (cl < 1){
    return inputPage();
  }

  // if there is no content, we assume that this is a fresh request, 
//   so we showed the input page, otherwise, we'll return dispatch to 
  //the processing code.
  postTest(clen);

}

这应该是一个CGI脚本。据我所知,使用GDB,print语句等,这段代码会在“cl = atoi(clen);”行中出现段错误。我不知道为什么会这样。 K&amp; R表明这是正确的。我基本上从其他六个在线教程中复制了这一行。它似乎在昨晚工作!我完全难过了。

4 个答案:

答案 0 :(得分:2)

我不相信它真的在atoi()

上崩溃了

你可以试试这段代码吗?

#include <iostream>
#include <stdlib.h>
#ifndef NULL
#define NULL 0
#endif

using namespace std;

int main(){
  char* clen;
  clen = getenv("CONTENT_LENGTH");
  if (clen==NULL){
    cout << "No such ENV var: CONTENT_LENGTH"<<endl;
    exit(0);
  }
  int cl = 0;
  cl = atoi(clen);
  if (cl < 1){
                    std::cout << "return inputPage();" << std::endl;
                    return 0;
  }

    std::cout << "postTest();" << std::endl;

}

编译它,例如到“app”并使用CONTENT_LENGTH的某些变体运行它,例如

./app
CONTENT_LENGTH=4 ./app
CONTENT_LENGTH=-4 ./app
CONTENT_LENGTH=a ./app

答案 1 :(得分:1)

除了编译器错误和bugged getenv()实现之外,我会说这段代码不可能在cl = atoi(clen)上进行段错误。这是因为getenv()返回NULL或指向空终止字符数组的有效指针(这只是说C字符串的一种奇特方式)。

由于检查了NULL情况,因此很可能程序(它不是“脚本”)在其他地方崩溃。

编辑:你怎么知道它甚至崩溃了?它是否显示HTTP 500错误?如果是,您很可能只是忘了cout << "Content-type: text/html\n\n"。 Web服务器日志说什么?

EDIT2 :与您的问题无关,但通常使用像atoi()这样的C函数不受欢迎; C ++版本lexical_cast(在TR1和boost中实现)是首选。

答案 2 :(得分:0)

你写道你一直在用GDB看它。不应该只是挖掘(步骤)到atoi()函数调用,以更好地了解正在发生的事情?我假设你确定它永远不会通过atoi()调用到达?

答案 3 :(得分:0)

事实证明,这对于atoi或者一般来说与C ++没有任何关系。问题是我忘记了一个非常基本的CGI点,即GET中没有CONTENT_LENGTH,这是浏览器不可避免的第一次调用。因此,我试图摆弄无效的clen。我发现没有CONTENT_LENGTH属性时,我只需要返回inputPage。