C:通过void返回的函数*
来自Java,我对Void的使用感到困惑,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; } 这是否返回指向已
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)