『C専門家プログラミング』ノート——第二章


『C専門家プログラミング』ノート——第二章


ラベル(スペース区切り):Cエキスパートプログラミング
  • p 48:関数戻り文字列方法:A.returnローカル変数(エラー)
    char * func()
    {
    char buffer[100];
    ....
    return buffer;//, ,buffer , 
    }
    
    B.文字列定数を指すポインタ
    char * func()
    {
    ....
    return "Only works for simple strings";//, ( , )
    }
    
    C.グローバル宣言を使用する配列を返す:(欠点はグローバル配列であるため、修正および上書きが容易である)
    char g_buffer[100];
    char * func()
    {
    
    ....
    g_buffer[i]=...
    return g_buffer;// 
    }
    
    D.静的配列を使用する:(関数の次の呼び出しは配列内容を上書きする)
    char * func()
    {
    static char buffer[100];
    ....
    return buffer;//, 
    }
    
    E.明示的なメモリ割り当て戻り値の保存:(マルチスレッドを使用するが、プログラマがメモリ管理を担当する必要があり、「メモリリーク」
    char* func()
    {
    char* s=malloc(120);
    ...
    return s;
    }
    
    Fが発生しやすい.最良の解決策は、関数の戻り値を保存するために呼び出し者にメモリを割り当てるように要求することである.セキュリティを向上させるために、呼び出し者は同時にバッファサイズを制定すべきである:
    void func(char* result,size_t size)
    {
    strncpy(result,"11111",size);
    }
    
    char* buffer=malloc(size);
    func(buffer,size);
    ...
    free(buffer);