C:通过void *返回的函数

时间:2009-08-01 22:52:29

标签: c memory pointers malloc void-pointers

来自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;  
}  

这会返回一个指向分配内存的指针吗?

6 个答案:

答案 0 :(得分:15)

是的,确实如此。 void *指针基本上是指向内存地址的通用指针,然后通常可以对任何实际需要的类型进行类型转换。

答案 1 :(得分:9)

您的问题表明您误读了函数的返回类型。之间有很大的不同:

void foo( void ) {}

void *bar( void ) {}

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

答案 2 :(得分:5)

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

答案 3 :(得分:3)

是。 void*表示指向某事物的指针,但没有特定类型。

答案 4 :(得分: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*表示这是一个指向内存的指针,我们还没有指定如何编制索引。

答案 5 :(得分:2)

void基本上没有类型,所以如果我们有void * p; p是指向某事物的指针,但我们还没有说出什么。

没有指针的void是没有因此void foo(void)是一个不带参数并且什么都不返回的函数。

是的,malloc返回指向一块内存的指针,malloc不知道或不关心内存有什么类型,所以它的返回类型是void *