gpt4 book ai didi

c - 再次修改常量..使用 void 指针

转载 作者:行者123 更新时间:2023-11-30 21:18:59 27 4
gpt4 key购买 nike

Possible Duplicate:
Modified a constant in c

const int z = 420;
const void *v;
v = &z;

printf("\n%d | %d",z,*(int *)v);
//420 | 420

printf("\n%d | %d",*(char *)&z,*(char *)v); //0th-Bit same value
//-92 | -92

printf("\n%d | %d",*((char *)&z+1),*((char *)v+1) ); //1st-Bit same value
//1 | 1

/***********************************************/
*((char *)&z+1) = 21; //I change value for the 1st-Bit
//see v is not touched here.

printf("\n%d | %d -(note)-successfully corrupted (z+1) and change reflected in (v+1)",*((char *)&z+1),*((char *)v+1) );
//21 | 21
//yes change is reflected in v after corruption of z

/****************the problem******************/

printf("\n%d | %d",z,*(int *)v); //but now value of v is courrupt...while that of z is same
//420 | 5540
printf("\n%u | %u",&z,v); //same address different values?
//1310548 | 1310548


/*************additional info*******************/

printf("\n%d | %d",*(&(*(&z+1))-1),*(int *)v);
//5540 | 5540

printf("\n%u | %u",(&(*(&z+1))-1),v);
//1310548 | 1310548

1>

指向“z”的空指针

当取消引用时会给出损坏的值

但是当直接使用 z 时,它会给出原始值。

所以同一个地址持有 2 个不同的值

2>

当 z 进行恒等指针变换时

(即递增和递减)

z 现在将输出损坏的值!

但 z 在进行正常变换或不进行变换时

像“*(&z) ”仍然会给出原始值。

最佳答案

如果您确实想防止数据被修改,请使用您的操作系统声明其内存页不可修改。

C和C++中的

const是一种概念上的安全机制和弱验证工具,而不是一种安全措施。它为遵循一定规则的程序员提供了保证。如果违反规则,则没有任何保证。 (根据严重程度,不能保证它不会崩溃。您的程序可以崩溃或为“常量”提供不一致的值。)

哦,你真正的问题是地址处如何“存在”两个不同的值。答案是,如果编译器确定它知道您正在引用常量,它不会查看地址,而只是给出值。毕竟,这就是你应该告诉它没问题的。

关于c - 再次修改常量..使用 void 指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3897054/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com