来自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;
}
这会返回一个指向分配内存的指针吗?
答案 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 *