为什么calloc指针类型为void*?
我正在读一本C语言书。但我不明白那个句子是什么 如果调用calloc成功,则返回指向内存中数组基的void*类型指针 这里,如果类型为void*的指针指向内存中数组的基,那么数组[0]的类型为void 我想知道这是什么意思为什么calloc指针类型为void*?,c,arrays,pointers,C,Arrays,Pointers,我正在读一本C语言书。但我不明白那个句子是什么 如果调用calloc成功,则返回指向内存中数组基的void*类型指针 这里,如果类型为void*的指针指向内存中数组的基,那么数组[0]的类型为void 我想知道这是什么意思 谢谢大家阅读我的问题,我希望得到答案 calloc返回void*因为: calloc可用于为任何类型的对象分配内存 void*可以隐式转换为其他指针类型 如果您使用: void* ptr = calloc(...); 它是有效的,但不能使用*ptr。Avoid*不可取消引用
谢谢大家阅读我的问题,我希望得到答案
calloc
返回void*
因为:
calloc
可用于为任何类型的对象分配内存void*
可以隐式转换为其他指针类型void* ptr = calloc(...);
它是有效的,但不能使用*ptr
。Avoid*
不可取消引用指针必须转换为其他类型才能取消引用。例如
char* cptr = ptr;
*cptr = 'a';
我可以理解,既然
int*
指向int
,那么void*
应该指向void
,这是多么诱人的想法。但事实并非如此。在void*
和void
之间确实没有有用的关系,所以最好将它们看作是单独的概念
void*
在C中表示指向未指定类型的对象的指针。如果您熟悉的话,可以将其视为Java对象的C类似物
void*
具有以下属性:
- 任何指针类型都可以在
void*
之间进行转换,即void*
的大小足以容纳任何指针,即使在指向不同类型的指针大小不同的机器上也是如此
void*
和其他指针类型之间的转换是隐式的,您不必执行显式转换
- 不允许取消引用
void*
,即,在访问指针指向的内存之前,必须将其转换为具体的指针类型
- 在标准C中,您不能在
void*
上执行地址算术,尽管GCC允许您作为文档化的扩展来执行
void*
是需要处理任意数据的函数的选择类型,如calloc()
请参见在编写[0]
之前将void*
转换为其他指针类型谢谢您的回答!谢谢你的回答!