在处理常量数据时,有没有办法确保const安全?
我的意思是,有没有办法阻止这种代码?
const int a;
int* p = (int*)&a;
*p = 0;
答案 0 :(得分:1)
绝对没有办法阻止您展示的代码类型。演员重新解释指针,让来电者随心所欲。结果,程序得到未定义的行为,并可能崩溃。不幸的是,它不会总是崩溃,在某些平台上它永远不会崩溃。
答案 1 :(得分:0)
没有。这就是演员的观点。
Consts对程序员的提示比编译器更多,如果程序员愿意,它们可以自由地被忽略。例如,如果编译器将数据驻留在内存的只读部分中,则调整该数据可能会导致严重问题。
即使const被“强制执行”,你也无法避免有人调整数据。 e.g:
int* p
const int a = 2;
int b;
p = &b + 1;
*p = 0;
这可能会破坏a
的值 - 它取决于平台和编译器。 (即,堆栈增长的方式以及a
,p
和b
相对于彼此的位置。
有时你可能希望将const指针强制转换为非const指针 - 即如果free()调用的范围不同,则将参数传递给free() malloc()一个。
#include <stdio.h>
#include <malloc.h>
int const* make_array(size_t size)
{
int *p = malloc(size * sizeof(int));
memset(p, 0xAA, size * sizeof(int));
return p;
}
int main()
{
int const *cp = make_array(500);
//do lots of read-only things with cp
free((void*)cp);
return 0;
}
答案 2 :(得分:0)
const限定符本身并不能防止这种情况发生,但您可以向其他人提供数据副本。此外,开发人员几乎从不使用此类强制转换,因为它可能会在运行时崩溃代码。编译器通常假定const限定指针指向的数据不会更改,即使是在此编译单元之外的代码也是如此。因此,如果有些人开始使用这些演员表,他们的程序可能会开始崩溃,如果他们使用优化编译器。可能你永远不会在工作中遇到这种做法,所以不要担心。