0

区切り文字「:」で PATH 環境変数を解析する必要があるプログラムを作成しています。関数 chop が配列を返そうとするまで、すべてが適切に機能しているようです。その後、次のエラーが表示されます。チョップを使用してユーザー入力も解析すると、正常に動作します。どんな助けでも大歓迎です。

//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;   
}
4

2 に答える 2

1

これに気づいたかどうかはわかりませんが、関数ローカル スコープを持つstd::stringオブジェクト内の場所へのポインターの配列を作成しています。xこの関数が戻るとすぐに、これらのポインターは意味のあるものであるとは限りませんx。破棄されるためです。

チョップされた単語のポインターの配列に永続的なストレージを割り当てていますが、ポインターが指すものの寿命が関数自体よりも長いことを保証できません。これらのポインターのいずれかを参照すると、未定義の動作になり、リンク リストの破損の原因になる可能性があります

それが問題の原因ではない場合でも、これは対処する必要があるエラーです。文字列オブジェクトがスコープ外になったときに何が起こるかを理解せずchop (...)に、操作する C ベースの関数を適応させてchar *置き換えたようです。std::string

于 2013-09-30T01:56:12.567 に答える