指针地址类型检查如何工作?

bem*_*m22 -1 c pointers undefined-behavior

我试图了解是否存在一种在处理指针时检查C中特定地址处变量类型的实现。

假设我们有以下代码:

Car car1; // variable of type Car in memory at address 0x100
Fruit fruit1; // variable of type Fruit at address 0x104
Car *pCar1; // pointer of type Car at address 0x108

pCar1 = &car1; // The type of the pointer matches the type of the variable, nothing special
Run Code Online (Sandbox Code Playgroud)

现在,我尝试进行手动地址处理,但没有任何错误。但是,由于类型不匹配,程序在运行时崩溃。

pCar1 = (Car *) 0x104; // Note I am deliberately offering a Fruit address and it works without build errors
Run Code Online (Sandbox Code Playgroud)

如何防止这种情况发生?有没有使这种愚蠢的失败保护机制或技术?

Mar*_*lli 6

pCar1 = (Car *) 0x104;
Run Code Online (Sandbox Code Playgroud)

不允许您在这里做什么。您不能强制转换绝对地址(在您的情况下,它指的是其他类型)并期望它起作用。为此,必须在运行时确保地址包含正确的变量类型。

在这种情况下,强制转换只会阻止编译警告,因为它告诉编译器“看,我知道我在做什么,相信我,Car此地址有一个”。当然,当您的程序运行并且希望Car在没有地址的0x104情况下找到一个地址时,将导致未定义的行为。

有没有使这种愚蠢的失败保护机制或技术?

绝对不。C远非“愚蠢的证明”。但是,如果您以“更好的方式”编写代码,则编译器会警告您:

pCar1 = &fruit1; // Results in a compiler warning.
Run Code Online (Sandbox Code Playgroud)

如何防止这种情况发生?

只是不要这样做。不要为变量分配随机地址或不同类型的地址。您只能分配给pCar1另一个Car变量的地址(例如pCar1 = &car1)或Car可以存储变量的存储位置的地址(例如适当的结果malloc())。


因此,最后:

指针地址类型检查如何工作?

C中没有“地址类型检查”之类的东西。只有编译器可以警告您某些变量的类型错误,只要您有机会这样做。显式投射消除了该机会。