2009-08-01 5 views
4

、Javaから来て、私は次のようでボイド可能戻り値を使用して混乱している:C:空を経由して返す関数*

void *emalloc(size_t s) { 
    void *result = malloc(s); 
    if (NULL == result) { 
     fprintf(stderr, "MEMORY ALLOCATION FAILURE\n"); 
    exit(EXIT_FAILURE); 
    } 
    return result; 
} 

は、このメモリの割り当てられたのチャックへのポインタを返すされていますか?

答えて

15

はい、そうです。 void *ポインタは、基本的にメモリアドレスへの汎用ポインタであり、通常は実際にどのような型に型変換されている可能性があります。

+2

*常にオブジェクトのポインタに変換することができるのボイド必ずしも関数ポインタである必要はありません。その変換の信頼性は実装に依存します。 –

5

はい、この関数は、指定されたサイズの割り当てられたメモリへのポインタを返しています。それはポインタを返すことが保証されているという意味でmallocと異なります。失敗した場合、アプリケーションは終了します。

+0

あなたはそれについては確かですか? C++の 'new'演算子はスローしますが、AFAIK標準のC mallocはエラー時に' NULL'を返すことができます。 –

+1

私は、あなたが「mallocとは違う」ということを意味しています(この 'emalloc'の例を参照してください)。 –

+0

@Earwicker:mallocはNULLを返すことができますが、emallocはNULLを返すことはできません。メモリを取得できない場合、プログラムは終了し、emallocは返されません。 –

3

はい。 void*は何かへのポインタを意味しますが、特定の型はありません。

9

あなたの質問は、関数の戻り値のタイプが誤っていることを示しています。間には大きな違いがあります:

 
void foo(void) {} 

 
void *bar(void) {} 

fooが()バー()は引数を取らず、汎用ポインタを返しながら、引数を取らず、値を返しません。 Cでは、キーワードvoidは汎用ポインタを示すために使用され、void *型のオブジェクトは情報の損失なしに他のオブジェクトポインタ型に変換できます。

2

Javaではポインタ演算はありません。これはあなたが求めているものだと思います。例えば、mallocあなたはおそらく基本的にarrayへのポインタであるポインタを受け取ることになるタイプint

int* malloc(size_t size) 
{ 
    // 
} 

のポインタを返すことを想像してみてください。その後、通常の配列のようにインデックスを作成します。

int* arr = malloc(10 * sizeof(int)); // 10 contiguous int(s). 

問題は、Cには関数が多重定義されていないという問題があります。だから、我々は一般的なmallocを書く方法を見つけなければならない。それ以外の場合は、タイプごとに異なるmallocになります。解決策は、必要なバイト数を送信することです。それから、あなたは好きなようにインデックスを付けることができます。これにより、柔軟性が向上し、すべてのソリューションに対応します。

int* i = (int*)malloc(10 * sizeof(int)); // 40 bytes if int = 4 bytes 
char* c = (char*)malloc(10 * sizeof(char)); // 10 bytes if char = 1 byte 

int thirdElement = i[3]; // third element. 12 bytes away from (*i) 
char secondElement = c[2]; // second element. 2 bytes away from (*c) 

ので、全体的なアイデアは、それは問題ではないということですどのように我々は、インデックス、我々はmallocからもらった記憶が。私たちがしなければならないことは、新しく作成された配列の型を指定して、正しく索引付けすることです。 void*は、これが、インデックスの作成方法を指定していないメモリ上のポインタであることを示します。

2

空白は本質的に型を持たないことを意味します。 pは何かへのポインタですが、何も言いませんでした。

ポインタを持たない空白は何もありません。void foo(void)は引数をとりません。何も返しません。

とはいmalloc関数はメモリの一部のチャンクへのポインタを返すことの戻り値の型がvoidであるので、malloc関数は、メモリを持っているどのようなタイプのことを知っているか気にしません*

関連する問題