C:通过void *返回的函数
-
10-07-2019 - |
题
来自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;
}
这会返回一个指向分配内存的指针吗?
解决方案
是的,确实如此。 void *指针基本上是指向内存地址的通用指针,然后通常可以对任何实际需要的类型进行类型转换。
其他提示
您的问题表明您误读了函数的返回类型。之间有很大的不同:
void foo( void ) {}
和
void *bar( void ) {}
foo()不带参数且不返回值,而bar()不带参数并返回通用指针。在C中,关键字void用于表示通用指针,void *类型的对象可以转换为任何其他对象指针类型而不会丢失信息。
是的,此函数返回指向指定大小的已分配内存的指针。它在malloc中的不同之处在于它保证返回指针。失败时它将退出应用程序。
是。 void*
意味着指向某事物的指针,但没有特定的类型。
void基本上没有类型,所以如果我们有void * p; p是指向某事物的指针,但我们还没有说出什么。
没有指针的void是没有因此void foo(void)是一个不带参数并且什么都不返回的函数。
是的,malloc返回指向一块内存的指针,malloc不知道或不关心内存有什么类型,所以它的返回类型是void *
在Java中没有指针算术。它认为这就是你要问的问题。例如,假设malloc
返回类型为int
int* malloc(size_t size)
{
//
}
您可能会收到指针,它基本上是指向array
的指针。然后你会像常规数组一样索引它。
int* arr = malloc(10 * sizeof(int)); // 10 contiguous int(s).
问题是C
没有函数重载。所以,我们必须找到一种编写通用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)
所以,整个想法是我们如何索引从<=>得到的内存并不重要。我们所要做的就是指定新创建的数组的类型以正确地对其进行索引。 <=>表示这是一个指向内存的指针,我们还没有指定如何编制索引。