我们可以通过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;
}
答案 0 :(得分:3)
据我所知,没有防水措施可以防止这种情况发生,但有办法可以避免这种情况。
例如,某些编译器有警告,您甚至可以将警告设置为错误(即如果触发警告则无法编译)。例如,在GCC上,您可以使用-Wcast-qual
和-Werror
(或-Werror=cast-qual
)。但这并不能完全阻止您修改const *
指向的数据,因为有很多警告可以解决这些问题。例如,您可以在某个平台上通过整数类型进行转换,例如(int*)((char const*)m - (char*)NULL)
,但请注意,这不是一个可移植的构造(但我认为无论如何,转换constness都是一个非可移植的构造)。
如果你想更进一步,你当然可以重新编译GCC以更好地跟踪限定符并禁止其中一些解决方法,但这可能会以降低标准一致性为代价。
另一种解决方案是使用某种棉绒工具。这些通常会发出正常编译器通过的警告。同样在构建脚本中,您通常可以将这些lint-warnings视为构建错误(而不是编译具有lint警告的文件)。