2016-11-10 7 views
1

私はこのコードサンプルを持っていて、一般的にそのロジックを理解していますが、いくつかの詳細にはまっています。Malloc in C - 戻り値

#define LSH_RL_BUFSIZE 1024 
char *lsh_read_line(void) { 
    int bufsize = LSH_RL_BUFSIZE; 
    int position = 0; 
    char *buffer = malloc(sizeof(char) * bufsize); 
    int c; 

    if (!buffer) { 
    fprintf(stderr, "lsh: allocation error\n"); 
    exit(EXIT_FAILURE); 
    } 

    while (1) { 
    // Read a character 
    c = getchar(); 

    // If we hit EOF, replace it with a null character and return. 
    if (c == EOF || c == '\n') { 
     buffer[position] = '\0'; 
     return buffer; 
    } else { 
     buffer[position] = c; 
    } 
    position++; 

    // If we have exceeded the buffer, reallocate. 
    if (position >= bufsize) { 
     bufsize += LSH_RL_BUFSIZE; 
     buffer = realloc(buffer, bufsize); 
     if (!buffer) { 
     fprintf(stderr, "lsh: allocation error\n"); 
     exit(EXIT_FAILURE); 
     } 
    } 
    } 
} 

私は2つのことを理解できません。まず、この行は正確には何ですか?

char *buffer = malloc(sizeof(char) * bufsize) 

第2に、次の行はどのように機能しますか?どのようにポインタを返すことができますか?

return buffer; 
+0

を参照してください。ちょうどあなたは整数を返すことができる方法を使用しています。あなたがそれをすることができないと思う何らかの理由がありますか? – MikeCAT

+0

['malloc'](https://linux.die.net/man/3/malloc)は、パラメータ(この場合は' bufsize')で指定されたメモリのチャンクをOSに要求します。あなたは関数の他の値と同じようにポインタを返します。その詳細は[ABI](https://en.wikipedia.org/wiki/Application_binary_interface)に依存します – yano

+0

私はそれが私たちに実用的なものを与えてくれますこの例では? – AdamSMith

答えて

3

この行は正確に何をするのでしょうか?

malloc malloc機能を動的メモリブロックを作成するために使用される「メモリ割り当て」を意味し、それは(パラメータなど)をバイト単位で指定されたサイズのメモリブロックを割り当てます。そのブロックの先頭へのポインタを返します。

ここで指定されたサイズは 'sizeof(char) * bufsize'です。つまり、長さ 'bufsize'の文字ブロックがリクエストされています。 1文字のサイズを取得するには、sizeof(sizeofは演算子ではなく、関数)を使用します。

次の行はどのように機能しますか?

ここmallocによって割り当てられたメモリのメモリブロックへのポインタを返すlsh_read_line機能 - それがbufferです。

どのようにポインタを返すことができますか?

ヒープからの動的メモリであるため、関数が復帰しても有効なメモリブロックです。

サイドノート - 'lsh_read_line'発信者がこのメッセージを無料で送信する必要があります。そうでない場合は、メモリリークが発生します。bufferC関数スタックの詳細については

は、「どのように我々は、ポインタを返すことができますか?」https://en.wikipedia.org/wiki/Call_stack