确保常量安全

时间:2014-03-22 23:35:42

标签: c pointers const

在处理常量数据时,有没有办法确保const安全?

我的意思是,有没有办法阻止这种代码?

const int a;
int* p = (int*)&a;
*p = 0;

3 个答案:

答案 0 :(得分:1)

绝对没有办法阻止您展示的代码类型。演员重新解释指针,让来电者随心所欲。结果,程序得到未定义的行为,并可能崩溃。不幸的是,它不会总是崩溃,在某些平台上它永远不会崩溃。

答案 1 :(得分:0)

没有。这就是演员的观点。

Consts对程序员的提示比编译器更多,如果程序员愿意,它们可以自由地被忽略。例如,如果编译器将数据驻留在内存的只读部分中,则调整该数据可能会导致严重问题。

即使const被“强制执行”,你也无法避免有人调整数据。 e.g:

int* p
const int a = 2;
int b;

p = &b + 1;
*p = 0;

这可能会破坏a的值 - 它取决于平台和编译器。 (即,堆栈增长的方式以及apb相对于彼此的位置。

有时你可能希望将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限定指针指向的数据不会更改,即使是在此编译单元之外的代码也是如此。因此,如果有些人开始使用这些演员表,他们的程序可能会开始崩溃,如果他们使用优化编译器。可能你永远不会在工作中遇到这种做法,所以不要担心。