有时会出现分段错误

时间:2014-12-01 17:50:22

标签: c++ c pointers memory memory-management

我在程序中对SEGFAULT感到困惑。我正在尝试实现scanf。所以我传递const char作为第一个参数,而不是为%条目解析它,而是使用变量参数来存储值。
我对此很困惑。
我不是C和C ++编程的专家。但我理解内存分配和使用。 这是我的代码片段。 我使用getline传递给它NULL指针指向char,0作为大小。根据手册,它本身应该是malloc记忆 我认为一些功能分配内存是个坏主意。但是让我们考虑一下就可以了 由于这个func有malloc内存,所以我必须释放它,但是当我试图这样做时,我得到了分段错误,但是如果我保持原样,程序中没有内存泄漏。我正在使用valgrind检查内存泄漏。

  

或者,在调用getline()之前,* lineptr可以包含一个          指向malloc(3)分配缓冲区* n字节大小的指针。如果          缓冲区不足以容纳线,getline()调整它的大小          使用realloc(3),根据需要更新* lineptr和* n。

这是我的代码段。

s = va_arg(argp, char *);
                if (lengthIsSet) {
                    size_t newLen ;
                    size_t readLen;
                    char *strInput = NULL;
                    length = atoi(lengthStr.c_str());
                    readLen = getline (&strInput,&newLen,inputSteam);
                   if (!strInput) {
                       break;
                   }                 
                   int sizeToCopy = (length<readLen)?length:readLen;
                   memcpy(s,strInput,sizeToCopy+1);
                   s[sizeToCopy] = '\0';
}

我已经尝试初始化size_t newLen = 0;它似乎工作知道,但我认为它不会导致问题。请帮忙解决这个问题。我将非常感谢任何帮助和解释。

修改

请建议如何使用C ++正确读取用户输入。不使用显式scanf,vscanf等。请帮忙,因为我花了几个小时处理这个问题。我发现只有这个函数可以从流中读取用户输入。也许使用C ++函数有任何好方法。我不是C ++和C的专家,所以不知道很多功能。

编辑2

void scanfCustom(const char* input, FILE *inputSteam, va_list argp) {
    const char *p;
    int * i;
    bool formFound = false;
    std::string lengthStr("");
    int length;
    bool lengthIsSet = false;
    unsigned u;
    char *s;
     p = input;
         for (; *p != '\0'; p++) {
        if ((formFound) && ( *p >= '0' && *p <= '9' ) ) {
                lengthStr+=(*p);
                lengthIsSet = true;
                continue;
             }
        if (*p == '%') {
            formFound = true;
            continue;
        }   
        formFound = false;
        switch (*p) {
            case 's':  
                 s = va_arg(argp, char *);
                if (lengthIsSet) {
                    size_t newLen = 0;
                    size_t readLen;
                    char *strInput = NULL;
                    length = atoi(lengthStr.c_str());
                    readLen = getline (&strInput,&newLen,inputSteam);
                   if (!strInput) {
                       break;
                   }                 
                   int sizeToCopy = (length<readLen)?length:readLen;
                   memcpy(s,strInput,sizeToCopy+1);
                   s[sizeToCopy] = '\0';
                   // free(strInput);
                   //fgets(s,length,inputSteam);
                }
//TODO READ FULL STR
        }
    }
}

1 个答案:

答案 0 :(得分:0)

如果getline失败会发生什么情况(例如输入流无效或用户在没有任何输入的情况下执行ctrl-c)?

getline将返回-1,您将崩溃。