maw*_*wia 52 c pointers casting
我想询问以下案例:
char *temp;
temp = malloc(10);
Run Code Online (Sandbox Code Playgroud)
由于返回类型malloc是void*,在被分配给temp之前,是否会malloc被隐式转换为char*类型返回的指针?标准在这方面说了什么?
如果我们的指针变量是某种结构类型,例如:
struct node *temp;
temp = (struct node *)malloc(sizeof(struct node));
Run Code Online (Sandbox Code Playgroud)
如果我们将内存分配给temp而不struct node*将其强制转换为类型,是否会将其隐式转换为struct node*类型,还是必须将其显式转换为struct node*类型?
unw*_*ind 51
如果你喜欢"不要重复自己"的心态,那么你应该很有吸引力,你不需要在malloc()调用中重复变量声明中的类型名称.因为,正如大家所指出的那样,你不会:指针转换为和void *不转换指针,但函数指针除外.
另外,在那个注释中,你不需要重复使用sizeof任何一个.第二个例子,在分配结构时,可以这样写:
struct node *temp;
temp = malloc(sizeof *temp);
Run Code Online (Sandbox Code Playgroud)
在我不那么谦虚的意见中,这是最好的方式.
避免重复自己会减少你写的东西的数量,从而减少任何这些错误的风险.
注意sizeof参数中的星号,这意味着"此指针指向的对象的大小",这当然与"类型的大小"相同,struct node但不重复类型名称.这是因为sizeof计算(在编译时!)作为其参数的表达式的大小.对于这种情况.就像sizeof 3计算类型表达式的大小一样int,sizeof *temp计算实例的大小struct node.
当然,你确实重复了一些事情,即变量名称本身,但这通常是一个更简单的表达式,更容易正确,并且编译器也可以更容易发现错误.
tek*_*ues 33
C中的void指针可以在没有显式强制转换的情况下分配给任何指针.
sth*_*sth 10
C隐式转换为from和to void*,因此转换将自动完成.在C++中只转换到 void*将被隐式完成,需要显式转换另一方向.