2016-11-27 17 views
-2

Cのポインターのポインターの末尾に文字列を追加しようとしていますが、以下のコードを使用していますポインタへのポインタがすべての割り当てられたメモリではない値を持つので、私が割り当てたものを解放することはできません。ポインタへのポインタの最後に文字列を追加するにはどうすればよいですか?Cのポインター(**ポインター)のポインターの末尾に文字列を追加する方法

int  add_environ(char *str, char **envp) 
{ 
    char **r; 
    int  i; 

    r = envp; 
    i = 0; 
    while (r[i]) 
    { 
     i++; 
    } 
//how can I add string without using malloc? 
// my problem is I can't free this allocated memory 
    r[i] = malloc(strlen(str)); 
    if (r[i]) 
    { 
     r[i] = str; 
     r[++i] = 0; 
     return (1); 
    } 
    return (0); 
} 
+1

私にとって、私は何も理解していません。 –

+1

あなたは 'setenv()'や 'putenv()'をシミュレートして環境を変更しようとしていますか、環境リストのような構造を操作しているのですか、 'envp'を誤って選択して、 'char *'の配列?あなたのコードがそれを担当しているかどうかにかかわらず、配列がどのように管理されているかを知る必要があります。また、時にはスペースをさらに割り当てる必要があります。 'char *'の配列がどこにあるのかを呼び出し側コードに伝える必要があります。関数に 'char ***'を渡すか、毎回開始を返します: 'char ** add_environ(const char * str、char ** envp)'。 –

+0

はい両方とも – julekgwa

答えて

1

ご質問が環境変数のみを対象としている場合は、setenvとします。そうでなければ、Waxratはあなたに1つの解決策を与えました。ああ、btw:あなたのコードでは、envpは任意に長いと仮定しています。これも真実ではないので、あなたのコードは遅かれ早かれクラッシュします。あなたの正確な要求に応じて、私はenvpの深いコピーをmainに作成してからそのコピーを操作することをお勧めします。それはすべてmallocとなります。

1

* envp配列のどの項目がヒープに由来しているかを覚えておく必要があります。例えば、ポインタの別の配列にそれらを格納することによって。あなたが描写したことを行うための実際の一般的な方法はありません。コンテキスト固有のものを行う必要があります。

関連する問題