我正在编写一个程序,该程序需要在定界符“:”处解析PATH环境变量。一切似乎都工作正常,直到函数chop试图返回数组为止。然后,我收到以下错误:“ glibc检测到./a.out:损坏的双向链接列表:0x08f8f148”。我使用印章还可以分析用户输入,并且可以正常工作。任何帮助是极大的赞赏。

//Parse environment variable
    char const* pPath = getenv("PATH");
    if (pPath == NULL){;}
    else{
        string ePath(pPath);
        envp = chop(ePath,':');
    }

char **chop(string s, char c){
    int i, j, k, len, words = 0;
    len = s.length();
    //determine # of words
    for(i=0;i<len+1;i++){
        if(s[i] == c || s[i] == '\0'){words++;}
    }
    char **array;
    string x;
    //allocate memory for char pointers
    if((array=(char**)malloc((words+1)*sizeof(char*))) == NULL){return NULL;}
    array[0] = &x[0];
    i = 0; k = 0;
    //split string on char c
    for(j = 1; j < (words+1); j++,k++,i++){
        //read in characters until delimiter
        while (s[k] != c && s[k] != '\0'){

            x[i] = s[k];
            i++; k++;
        }
        x[i] = '\0';
        array[j] = &x[i+1];
    }
    array[j] = 0;
    return array;
}

最佳答案

我不知道您是否注意到了这一点,但是您正在创建一个指针数组,这些指针指向具有功能局部作用域的std::string对象x中的位置。该函数返回后,就不会保证这些指针是有意义的,因为x将被销毁。

您正在为切碎的单词的指针数组分配持久性存储,但是无法确保它们指向的对象的寿命比函数本身更长。如果引用这些指针中的任何一个,它将是未定义的行为,这可能是导致链表损坏的原因。

即使不是造成问题的原因,这仍然是需要解决的错误。看起来您似乎改编了在chop (...)上运行的基于C的char *函数,并用std::string替换了它,但没有意识到当字符串对象超出范围时会发生什么。

10-08 11:56