C:通过void返回的函数*

C:通过void返回的函数*,c,memory,pointers,malloc,void-pointers,C,Memory,Pointers,Malloc,Void Pointers,来自Java,我对Void的使用感到困惑,Void允许返回以下值: void *emalloc(size_t s) { void *result = malloc(s); if (NULL == result) { fprintf(stderr, "MEMORY ALLOCATION FAILURE\n"); exit( EXIT_FAILURE ); } return result; } 这是否返回指向已

来自Java,我对Void的使用感到困惑,Void允许返回以下值:

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

这是否返回指向已分配内存卡盘的指针?

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

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

是的
void*
表示指向某个对象的指针,但没有特定类型。

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

void foo( void ) {} void foo(void){} 及

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

在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*
表示这是一个指向内存中未指定如何索引的位置的指针。

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

没有指针的void什么都不是,因此void foo(void)是一个不带参数也不返回任何内容的函数


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

你确定吗?C++的
new
操作符抛出,但如果标准的C malloc出现错误,它可以返回
NULL
。我明白了,你的意思是“它不同于
malloc
”(参考这个
emalloc
示例)-以为你指的是
malloc
本身。@Earwicker:malloc可以返回NULL,但emalloc不能。如果无法获取内存,程序将退出,emalloc不会返回。与此问题无关,但emalloc()是标准函数吗?这只是一个malloc包装器,用于将malloc的错误处理从调用方移动到被调用方。void*可能始终转换为对象指针,但不一定转换为函数指针。转换的可靠性取决于实现。
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)