【发布时间】:2016-01-17 18:49:12
【问题描述】:
我有一个非常简单的测试函数,我用它来弄清楚 const 限定符发生了什么。
int test(const int* dummy)
{
*dummy = 1;
return 0;
}
这让我对 GCC 4.8.3 产生了错误。 然而这个编译:
int test(const int* dummy)
{
*(char*)dummy = 1;
return 0;
}
因此,似乎 const 限定符仅在我使用参数而不强制转换为其他类型时才有效。
最近我看到了使用的代码
test(const void* vpointer, ...)
至少对我来说,当我使用 void* 时,我倾向于将其强制转换为 char* 以便在堆栈中进行指针运算或进行跟踪。 const void* 如何防止子程序函数修改 vpointer 所指向的数据?
【问题讨论】:
-
const T*表示指针指向的数据是const。第二个非常脆弱,因为它抛弃了 const。 -
@ColonelThirtyTwo 但是从我在其他 stackoverflow 帖子上读到的内容来看,不是 const void* 经常用于防止数据被修改吗?但在我看来,通过强制转换可以很容易地对其进行修改。
-
@MoneyBall 是的,但铸造就是这样。这就是强制转换很危险的原因——我可以将您的“const int *”转换为“int64_t *”和 SIGSVF 或损坏其他数据。问题在于 casting 而不是 const 声明。
-
@Mσᶎ 对,我认为 const 限定符可以防止数据被修改。事实证明,C 可以让你强制转换和修改它而不会引发任何错误。
-
请原谅我的措辞,但是....如果
const在你将某些东西转换为非常量类型的情况下会起作用,那该有多愚蠢?试想一下,你有一个给定的原型,用于某个回调或出于内部目的而具有参数 const 的东西。但是,如果您知道您的实现将永远不会提供 const 参数,或者您能够捕捉到这种情况,为什么编译器如果您通过强制转换明确表示它不必被视为常量,无论如何将其视为常量?
标签: c pointers type-safety