什么确实在铸造一个指针?
假设我有以下c代码:
int* vector = (int*)malloc(5 * sizeof(int));
malloc返回一个无效指针,因为不知道什么被要求分配空间。
因此,我们将void指针投射到一个int指针。
转换实际上是否在运行时执行任何操作,还是仅仅需要编译? 如果它在运行时工作,它在做什么?
指针的转换在编译时是必需的,除了指向void的指针之外,可能会将指针转换为指针或将指针转换为任何类型,而无需显式强制转换。
运行时发生的情况不是由语言指定的,除非指向char的指针和指向void的指针需要具有相同的表示形式。 对于剩下的内容,唯一需要的是(6.3.2.3转换/指针第7节)指向对象或不完整类型的指针可以转换为指向不同对象或不完整类型的指针。 如果生成的指针未针对指向类型正确对齐,则行为未定义。 否则,当再次转换时,结果应与原始指针相等
但在通用架构中,指向任何对象的指针的表示形式是其第一个字节的地址。 所以在运行时指针转换是无操作的。
投射指针可以做一些不重要的事情。 但是,通常指向特定地址的任何类型的指针都具有相同的表示形式,因此该表演不会执行任何操作。
也就是说,只有代码是以面值实现的, 各种疯狂的事情都可以通过优化来实现,所以包含可执行文件的机器代码并不直接与源代码相对应。 (当然,在这种情况下,演员们可能还没有任何对应的东西)
演员在运行时不会做任何事情。 它在编译时使用,让编译器知道你确实打算将一种数据类型视为另一种数据类型。
void *
是特殊的,因为在C中(但不是C ++),您可以将任何(非函数)指针指向或从void *
指派,而不需要编译器警告您。
正因为如此,你永远不应该投或从void *
,因为你是在为你做例子。 在malloc
的情况下,这样做可以掩盖你忘记#include <stdlib.h>
的事实,这会导致代码中其他地方出现一些细微的错误。
上一篇: what does casting a pointer 'actually' do under the hood?