C语言:通过void *返回函数

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

这是否返回一个分配的内存块的指针?
6个回答

18

是的,它是。一个void*指针基本上是指向内存地址的通用指针,可以将其强制转换为实际所需的任何类型。


2
一个 void* 总是可以转换成对象指针,但不一定能转换成函数指针。该转换的可靠性取决于实现方式。 - William Pursell

9

您的问题表明您误读了函数的返回类型。以下两种写法有很大区别:

void foo( void ) {}

void *bar( void ) {}

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


5

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


你确定吗?C++的new运算符会抛出异常,但据我所知,标准的C malloc在出错时可以返回NULL - Daniel Earwicker
1
我明白了,你的意思是“它不同于malloc”(指的是 emalloc 的例子)- 我以为你是指malloc本身。 - Daniel Earwicker
@Earwicker:malloc可能会返回NULL,但emalloc不会。如果它不能获得内存,程序将退出并且emalloc不会返回任何内容。 - William Pursell
不关乎这个问题,但 emalloc() 是一个标准函数吗? - nagul
这只是一个malloc包装器,将malloc的错误处理从调用者移动到被调用者。 - Carson Myers

3
是的。void*表示指向某个东西的指针,但它没有特定的类型。

2

在Java中,没有指针算术。我想这就是你要问的内容。例如,想象一下,malloc返回一个类型为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

void的意思是没有类型,因此如果我们有void *p; p是指向某个东西的指针,但我们没有说明是什么。

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

而且,malloc返回一个指向一块内存的指针,malloc不知道也不关心那块内存的类型,因此它的返回类型是void*。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接