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

您的问题表明您误读了函数的返回类型。两者之间有很大区别:

无效富(无效){}

无效 *bar( 无效 ) {}

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为每种类型提供不同的结果。解决方案是发送您需要的所需字节数。然后,您可以随意索引它。这提供了更大的灵活性和一个通用的解决方案。

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 回答