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



我试图了解在处理指针时是否有用于检查 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

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

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

如何防止这种情况发生?是否有一种故障安全机制或技术来证明这种愚蠢的证明?

pCar1 = (Car *) 0x104;

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

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

是否有一种故障安全机制或技术来证明这种愚蠢的证明?

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

pCar1 = &fruit1; // Results in a compiler warning.

如何防止这种情况发生?

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


所以,最后:

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

C 中没有"地址类型检查"这样的东西。只有编译器可以警告您某个变量的某些内容类型错误,如果您有机会的话。显式强制转换消除了这种机会。

最新更新