51

私は C プログラマーではないので、C 文字列にはあまり詳しくありませんが、C ライブラリを使用する必要があるため、問題を示すコードの短縮バージョンを次に示します。

char** ReadLineImpl::my_completion () {
    char* matches[1];
    matches[0] = "add";

    return matches;
}

次の警告が表示されます。

警告 - 返されたローカル変数 'matches' に関連付けられたスタック メモリのアドレス

また、私のプログラムは正しく動作していないようです (上記の警告が原因である可能性があります)。

警告は何を意味しますか? それは何か問題を引き起こしますか?

4

5 に答える 5

71

変数char* matches[1];はスタック上で宣言され、現在のブロックがスコープ外になると自動的に解放されます。

これは、 に戻るmatchesと、予約されていたメモリmatchesが解放され、ポインターが不要なものを指していることを意味します。

これは多くの方法で解決できますが、そのうちのいくつかは次のとおりです。

  1. Declare matches[1]as static: static char* matches[1];- これにより、スタックではなく静的スペースにスペースが割り当てられます (関数のすべてのインスタンスが同じ変数を共有matchesするため、不適切に使用すると噛み付く可能性があります)。my_completionmatches

  2. 呼び出し元関数にスペースを割り当て、それをmy_completion function:my_completion(matches)に渡します。

    char* matches[1];
    matches = my_completion(matches);
    
    // ...
    
    char** ReadLineImpl::my_completion (char** matches) {
         matches[0] = "add";
    
         return matches;
    }
    
  3. ヒープ上の呼び出された関数にスペースを割り当て ( malloccalloc、およびフレンズを使用)、所有権を呼び出し元関数に渡します。呼び出し側関数は、不要になったときにこのスペースの割り当てを解除する必要があります ( を使用free)。

于 2013-08-04T08:27:32.423 に答える
-2

変化する

char* matches[1];

char *matches = new matches[1];
于 2015-04-26T00:59:32.593 に答える