2009-08-01 66 views
4

从Java即将回来时,我很困惑通过使用虚空允许在下列返回值:C:功能通过void *的

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

一个void *总是可以被转换成一个对象指针,但不一定是函数指针。该转换的可靠性取决于实施。 – 2009-08-02 13:10:32

5

是的,这个函数返回一个指向指定大小的分配内存的指针。它在malloc中的不同之处在于它保证返回一个指针。失败时将退出应用程序。

+0

你确定吗? C++的`new`运算符会抛出异常,但AFAIK标准C malloc可以在出错时返回NULL。 – 2009-08-01 23:05:52

3

是的。 void*含义指向某些东西,但没有特定类型的指针。

9

你的问题表明你误读函数的返回类型。有一个很大的区别:)

 
void foo(void) {} 

 
void *bar(void) {} 

富(不带任何参数,并且不返回一个值,而巴()不带任何参数,并返回一个通用指针。在C中,关键字void用于指示通用指针,并且void *类型的对象可以转换为任何其他对象指针类型而不会丢失信息。

2

在Java中没有指针算术。它认为这是你所问的。例如,假设malloc返回类型int

int* malloc(size_t size) 
{ 
    // 
} 

您将可能接收该指针,这基本上是一个指向array的指针。然后你会像普通数组一样索引它。

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

void意味着基本上没有类型,所以如果我们有void * p; p是指向某个东西的指针,但我们没有说什么。

void没有指针的void就是没有void void foo(void)是一个函数,它不接受任何参数并且不返回任何内容。

没错的malloc返回一个指向一些内存块,malloc不知道或不关心什么类型的内存了,所以它的返回类型为void *