理解函数(const int * a)指向整数常量的指针

时间:2017-01-02 05:46:39

标签: c pointers const

我们可以通过b修改常量整数指针的值 我们可以确保/限制意外修改价值吗?

 #include <stdio.h>

/**
 * Snippet to under working of "pointer to integer(any) constant"
 * 
 * We are able to modify the value of constant integer pointer by b, how 
 * can we make sure/restrict accidentally modification of the value .
 * 
 */

void modify_value(const int *m, const int *n) {
    //*m = 50;         // expected error, assignment of read-only location
    *((int*)n) = 100;  // value of pointed by pointer gets updated !! 
}   

int main() {
    int a=5,b=10;
    printf("a : %d , b : %d \n", a,b);
    modify_value(&a,&b);
    printf("a : %d , b : %d \n", a,b);
    return 0;
}

1 个答案:

答案 0 :(得分:3)

据我所知,没有防水措施可以防止这种情况发生,但有办法可以避免这种情况。

例如,某些编译器有警告,您甚至可以将警告设置为错误(即如果触发警告则无法编译)。例如,在GCC上,您可以使用-Wcast-qual-Werror(或-Werror=cast-qual)。但这并不能完全阻止您修改const *指向的数据,因为有很多警告可以解决这些问题。例如,您可以在某个平台上通过整数类型进行转换,例如(int*)((char const*)m - (char*)NULL),但请注意,这不是一个可移植的构造(但我认为无论如何,转换constness都是一个非可移植的构造)。

如果你想更进一步,你当然可以重新编译GCC以更好地跟踪限定符并禁止其中一些解决方法,但这可能会以降低标准一致性为代价。

另一种解决方案是使用某种棉绒工具。这些通常会发出正常编译器通过的警告。同样在构建脚本中,您通常可以将这些lint-warnings视为构建错误(而不是编译具有lint警告的文件)。