4

Java から来て、次の戻り値を許可する Void の使用に混乱しています。

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

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

4

6 に答える 6

17

はい、そうです。void* ポインターは、基本的にメモリ アドレスへの汎用ポインターであり、通常、実際に必要な型に型キャストできます。

于 2009-08-01T22:54:15.830 に答える
9

あなたの質問は、関数の戻り型を読み間違えていることを示しています。間に大きな違いがあります:

void foo(void){}

void * bar(void){}

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

于 2009-08-01T23:01:48.730 に答える
5

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

于 2009-08-01T22:54:17.857 に答える
3

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

于 2009-08-01T22:54:32.537 に答える
2

Javaにはポインタ演算はありません。これがあなたが求めていることだと思います。たとえば、mallocタイプのポインタを返すと想像してくださいint

int* malloc(size_t size)
{
    //
}

基本的にはへのポインタであるポインタを受け取る可能性がありますarray。次に、通常の配列のようにインデックスを付けます。

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

問題は、C関数のオーバーロードがないことです。したがって、ジェネリックを作成する方法を見つける必要がありますmalloc。そうしないと、mallocタイプごとに異なる結果になります。解決策は、必要なバイト数を送信することです。次に、好きなようにインデックスを付けることができます。これにより、柔軟性が高まり、すべてのソリューションに1つになります。

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*これは、インデックス作成方法を指定していないメモリに配置するためのポインタであることを意味します。

于 2009-08-01T23:42:43.093 に答える
2

voidは本質的に型がないことを意味するので、void*pがある場合。pは何かへのポインタですが、私たちは何を言っていません。

ポインタのないvoidは何もないので、void foo(void)は引数を取らず、何も返さない関数です。

そして、はい、mallocはメモリのチャンクへのポインタを返します。mallocはそのメモリのタイプを認識または気にしないため、戻りタイプはvoid*です。

于 2009-08-04T20:13:23.427 に答える