首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么打印后的值仍然是2?即使将地址更改为区域地址,也会发生这种情况

这个问题涉及到指针和变量的概念。在C或C++等编程语言中,变量是用来存储数据的,而指针是用来存储变量的地址的。当我们将一个变量的地址赋给一个指针时,指针就可以通过该地址访问到变量的值。

在这个问题中,假设有一个变量x,其值为2。我们可以通过以下代码来演示:

代码语言:txt
复制
int x = 2;
int* ptr = &x;

在这段代码中,我们定义了一个整型变量x,并将其值设置为2。然后,我们定义了一个指针ptr,并将x的地址赋给ptr。

现在,如果我们打印ptr指针所指向的值,即*ptr,我们会得到2,因为ptr指向了x的地址,而x的值为2。

代码语言:txt
复制
printf("%d", *ptr); // 输出2

无论我们将ptr的地址更改为什么值,只要它指向了x的地址,打印出来的值仍然是2。这是因为指针ptr指向了x变量的内存位置,而不是一个区域地址。无论我们如何更改指针的地址,它仍然指向同一个变量x。

需要注意的是,如果我们将指针ptr的地址更改为一个不合法的地址,或者将其指向其他变量的地址,那么打印出来的值将是不确定的,可能会导致程序崩溃或产生错误结果。

总结起来,无论我们如何更改指针的地址,只要它指向了变量x的地址,打印出来的值仍然是2。这是因为指针指向了变量的内存位置,而不是一个区域地址。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

动态内存管理

(但其实其内存区域分布复杂多了,这个只是简化版,之后会讲其更细致的内存区域划分版本) 函数使用时分配的内存在栈区,局部变量分配内存也在栈区。...1.对于被释放的内存我们不能再访问了,再访问属于非法访问系统报错。只能访问被申请的内存。(数组越界访问属于这种); 2.当一个内存被释放后,其存的值并不会被改变,只是其不能再访问了。...而malloc并不会对里面的区域初始化,所以malloc在开辟完后空间内的值都是随机值。 calloc开辟内存失败同样会返回NULL。...//失败的话指向原空间的地址也会变NULL,我们就找不到原空间,它会变为一个隐患,所以代码1不行 //代码2 - 先将realloc函数的返回值放在p中,不为NULL,在放ptr中 int*p...如果出现这种相似的情况但其结果依然是正常打印出想要的结果,那你完全是运气好,其新函数开辟的空间刚好没在这地址上面或者其新函数在这地址上面开辟但是其要重置的部分刚好不在这地址上,从而就没被修改,打印出正常的结果

13810

iOS底层原理总结 - 探寻block的本质(一)

为什么两种变量会有这种差异呢,因为自动变量可能会销毁,block在执行的时候有可能自动变量已经被销毁了,那么此时如果再去访问被销毁的地址肯定会发生坏内存访问,因此对于自动变量一定是值传递而不可能是指针传递了...c++代码 上图中可以发现,即使block中使用的是实例对象的属性,block中捕获的仍然是实例对象,并通过实例对象通过不同的方式去获取使用到的属性。...打印内容 可以发现a的值变为了不可控的一个数字。为什么会发生这种情况呢?...c++代码 为了避免这种情况发生,可以通过copy将NSStackBlock类型的block转化为NSMallocBlock类型的block,将block存储在堆中,以下是修改后的代码。...2. 将block赋值给__strong指针时 block被强指针引用时,RAC也会自动对block进行一次copy操作。

1.1K41
  • Cache一致性导致的踩内存问题

    注:上面的size为0,是因为该值是从内存中直接解析出来的,从这里也可以看出该内存区域被破坏了,导致解析出来的内存块大小异常。后面介绍内存标记后就可以理解这里的值为啥会为0。...但是,如果是踩内存的话,偏偏只踩了中间的0xffffeeee这四个字节,而且前面的内容没踩,后面的内容也没踩,更诡异的是,被踩区域写入的恰好是ThreadX的内存free标记。...从反汇编中看哪些地方会写0xffffeeee到内存区域,其实从上面的实验就可以知道该方法无效了,因为即使改为0xaaaabbbb问题仍然出现。...B的前16个字节被改为0x34,而0x34是B的历史值,红色方框里也应该被填充为0x49 ?...由于整个B中被填充的都是同一个值,下面两种情况无法区分: B前16个字节的值被缓存,而后又被赋值到原来的位置 B的某个字节的值被缓存,而后又将该值填充到B的前16个字节(如果是这种情况,就不太像是DMA

    3.1K53

    【Linux修炼】10.进程地址空间

    我们之前所理解的指针,是内存中变量的地址,但是我们现在打印的地址同样是以指针的形式打印的,那么到现在发生的情况也证实了我们之前理解的指针指向的空间是错误的,指针指向的位置并不是物理内存!...(如果是物理内存,那么不可能发生同一个地址的变量的值不相同的情况) 1.3 解释现象 那么多个进程在读取同一个地址的时候,怎么可能出现不同的结果?...我们打印时,地址并没有发生变化,但是值不同,也就说明了我们所看到的地址绝对不是物理地址!曾经我们学习C/C++的基本的地址(指针)也一定不是对应的物理地址!...因此对于这个现象得出了一个结论:我们所看到的打印出来的地址空间分布都是虚拟地址(也可称为线性地址、逻辑地址)! 我们称这种地址为虚拟地址空间。...但是,这个男孩仍然经常不注意,由于体型原因总是越过这条线,于是就和女孩解释他也不是故意的,为了避免出现这种情况,女孩想了一个办法,各自将线退后5cm,余下的10cm就是缓冲地带,两个人都可以使用,这样也可以防止越界的情况发生

    1.2K00

    程序员C语言快速上手——高级篇(十)

    ,并将原内存空间中的数据复制到新空间,只是这样一来,其他地方保存的原内存空间的地址就必须修改为realloc返回的新地址,且原内存空间会被释放,旧地址不可用。...再来看元素内存地址的打印结果 22fe10 22fe10 22fe14 22fe18 22fe1c 可以发现二维数组很像一个二维表格,有行有列,但是从元素的内存地址可以看出,在内存中仍然是连续的一片。...我们知道指针变量是用来保存一个普通变量的地址的,那么如果对一个指针变量取地址,并用另一个变量保存指针变量的地址,这种情况是否存在呢?...: p=22fe4c pp=22fe40 &pp=22fe38 可以看到,凡是变量都有地址,即使是指针变量也是有地址的,这种使用两个*来声明的指向指针的变量,就是二级指针。...如上例,*pInt解引用后结果错误,这就是因为原类型是short2字节,而使用int*指针去解引用会超出short本身的两字节内存,将紧随其后的两字节内存也强制读取了,访问了不合法的内存空间,这实际上是内存越界造成的错误值

    1.4K30

    C语言进阶——动态内存管理

    x64环境内存分配更激进,运行一会内存就爆了,然后就会蓝屏(我已经试过了),如果想玩玩记得保存好数据,举出这个例子就是想让大家记住这两个重要的点:要合理、要释放,避免发生意外情况。...,这里我想到了一个题目:小乐乐与序列,题目大概意思就是将序列去重后排序并输出,这里的解题思路是:找到与数列中的数值对应的下标(这里的下标是指申请空间中对于首地址的偏移量),再将其对应的值改为1(改的是申请空间的值...当然此题还有其他错误,下面来看看详解:  1.传值调用,即使成功开辟空间,也不会对实参 str 造成影响 2.没有对函数 GetMemory 中的开辟情况进行判断 3.对空指针 str 的解引用(...此时即使得到了 p 指向空间的地址,也无法打印出之前的值。换句话说,此时的指针 str 指向空间是一块全是随机值的空间,强制打印会得到一串乱码。...纠正方案   将数据存放在静态区中,这样在函数 Test 中也能使用了。   至于为什么不直接在堆上申请,使用完后释放?

    52710

    【前端】JavaScript 变量引用、内存与数组赋值:深入解析三种情景

    本文将详细讨论三种不同的代码场景,结合 JavaScript 的变量引用与内存模型,深入分析为什么这些代码输出会如此不同。...此时,newArr 不再指向原来的数组 [1, 2, 3],而是指向了一个全新的数组。而 arr 依然保持指向原始数组的引用,因此打印 arr 时结果仍然是 [1, 2, 3]。 2....这也是为什么在打印 newArr 时,它依旧指向 [1, 2, 3]。...因此,当 arr[2] 被修改为 6 时,newArr 看到的也是修改后的数组 [1, 2, 6]。 JavaScript 中的内存共享 在 JavaScript 中,数组和对象是通过引用来传递的。...当多个变量引用同一个数组时,修改这个数组的内容将影响到所有引用该数组的变量。这种行为称为内存共享。 要理解内存共享,可以将数组或对象看作是存在于某个位置的数据块,而变量是指向这个数据块的“指针”。

    12300

    MIT 6.S081 Lab Four -- Trap

    输出取决于RISC-V小端存储的事实。如果RISC-V是大端存储,为了得到相同的输出,你会把i设置成什么?是否需要将57616更改为其他值? 这里有一个小端和大端存储的描述和一个更异想天开的描述。...在下面的代码中,“y=”之后将打印什么(注:答案不是一个特定的值)?为什么会发生这种情况?...为什么会发生这种情况?...---- 代码解析 这个函数就是实现曾经调用函数地址的回溯,这个功能在日常的编程中也经常见到,编译器报错时就是类似的逻辑,只不过题目的要求较为简单,只用打印程序地址,而实际的报错中往往打印程序文件名,...如果您告诉qemu只使用一个CPU,那么使用gdb查看陷阱会更容易,这可以通过运行 make CPUS=1 qemu-gdb 如果alarmtest打印“alarm!”,则您已成功。

    29931

    一篇文章助力大家理解Python 代码中的垃圾回收机制

    但是,获取2>标签下面的标签时,获取的仍然是同一个标签。 这样一来,在上图代码里面第15-20行就会重复执行两次。...于是,我想看看每次提取的时候,对应的 element 是哪个,但却发生了更诡异的事情,我们做一个看起来对代码不会有任何影响的改动: ?...但奇怪的事情就这样发生了,问题消失了!在图4大量打印的同一个标签,缓存的数据跟提取的数据不一致!,在图5里面却一条都没有打印。这样修改以后,GNE 的提取的结果就正确了。 但为什么会发生这种事情呢?...薛定谔的 element。 看不见的手 遇事不决,量子力学。这个问题跟量子力学实际上没有关系。导致这个诡异情况发生的原因,是一个一直运行在 Python 里面,但是你常常忽略的机制——垃圾回收。...这块区域不会被其他数据使用。那么每次循环,新的element对象都会新申请一块内存区域来存放数据,于是就等价于每一个不同的 element 节点对应了不同的内存地址。

    50320

    计算机初级选手的成长历程——指针(1)

    p2,在通过解引用将地址中存储的值改为0时,p2改变了2个字节的内容;对于int*类型的指针p3,在通过解引用将地址中存储的值改为0时,p3改变了4个字节的内容;对于long long*类型的指针p4,...对于家养的小动物来说,我们只需要通过它们主人的住址就能找到它们,但是野生的小动物你即使知道它的活动区域也不一定能找到它,因为它们的位置是不可知的。...4.4 指针越界访问 当我们正常的给指针初始化后,也可能出现野指针的情况,如下所示: 在这个代码中,对于数组arr来说,它的空间内只有3个元素,我们通过数组名将数组的首元素地址赋值给变量p后,变量p在进行对地址内容修改时...这种情况就好比: 还是这个张三,他此时开了三间房,并且在酒店前台登记了,结果他在入住时,不仅将开好的三间房中放置了自己的行李,他还将自己的行李放在了另外两间房间内; 这种情况下,对于酒店来说,张三对未登记的两间房间进行了越界访问...test并在函数内部创建了一个变量a,a的空间内部存放的值为1,此时我们将a的地址返回给函数,在主函数中整型指针p接收了这个返回值,并将地址中的值打印出来了。

    15110

    C++ 多态的实现机制

    只有通过指针或者引用调用才会是动态绑定, 此处当然在 a=b; 后, 即使通过指向 a 的指针调用也不会是动态绑定的, 这是因为, 在进行对象的赋值操作时, 虚函数表指针 vptr 并不会随着赋给 a,...是否可以做一些邪恶的事情呢 ?手动将 b 的 vptr 赋值给 a 会怎样? 千万不要在实际写代码中这样做!...//我在 g++ 下编译需要将 *(p+1) 改为 *(p+2), 原来的 *(p+2) 改为 *(p+3) 我暂时先不去研究了 //若无法得到预期的结果, 将 Animal 和 Dog 的 protected...同时可以看到, 最后打印了一个奇怪的值, 因为 Dog 类中新增了一个成员变量 tail (可以看到尽管 tail 是private 也并非没有办法去访问甚至修改), 而在基类 Animal 中是不存在的...可以看一下相应的汇编代码 image.png 在 Visual Studio x86 编译下出现的这种情况是可以复现的, g++ 编译却没有出现过.

    68340

    DNS 系列(一):为什么更新了 DNS 记录不生效?

    所以用户会更倾向于用名字来标识主机,DNS 就是为这种需要而开发的。DNS 代表域名系统。该系统会将域名翻译成实际的 IP 地址。...尽管域名可能是永恒不变的,但记录指向的地址及使用的 DNS 服务器却会因为需求经常变动。有时我们也会遇到修改了 DNS 记录后,实际访问到的地址却没有更新的情况,这就涉及到了 DNS 传播。...除了服务器负载,还有一些因素也会影响 DNS 传播。影响 DNS 传播的因素DNS 区域和 TTL 值DNS 被分成许多不同的区域,是 DNS 命名空间的一部分,由特定组织或管理员加以管理。...这种做法的好处是响应更快,同时也减少了数据流量的产生。但是,这可能会对 DNS 传播产生影响。此外,一些 ISP 会直接忽略 TTL 设置,并且固定每两到三天才更新一次缓存记录。...等 TTL 值更新后,再修改 DNS 服务器。不过就算未传播完,也不影响域名解析记录的修改。即便 DNS 服务器仍然是旧的,但是解析记录会实时更新,网站内容也会是最新的。

    4.8K30

    简单聊聊G1垃圾回收算法整个流程 --- 理论篇 -- 上

    典型的读-修改-写回原子性问题 在这种情况下,*field 最终会被 t2 写入 obj2。但是 t1 写入的 obj1并不会被添加到 SATB 本地队列中。...在这种情况下,来自 obj4 的引用消失会被 SATB 专用写屏障获知,obj1 会变成灰色,所以也不会有问题。 SATB 专用写屏障会记录下并发标记阶段开始时对象之间的引用关系。...通过使用转移专用记忆集合,在转移时即使不扫描所有区域内的对象,也可以查到待转移对象所在区域内的对象被其他区域引用的情况,从而简化单个区域的转移处理。...另外,并发标记中使用的 SATB 本地队列和 SATB 队列集合中的引用也包含在 $root 中,会被转移。这是因为它们的引用地址都必须改为转移后的地址。...保存在旧位置的这个新地址称为forwarding 指针。 保存转移后新地址的变量。一旦发现了指向转移前地址的指针,就能将其改为指向转移后的新地址。

    2.4K20

    使用 React Hooks 时需要注意过时的闭包!

    即使 value 变量在调用increment()时被增加多次,message变量也不会更新,并且总是保持一个过时的值 "Current value is 0"。 过时的闭包捕获具有过时值的变量。...然后看看控制台,每2秒出现一次Count is: 0,尽管count状态变量实际上已经增加了几次。 为什么会这样? 第一次渲染时,状态变量count初始化为0。...之后,即使在单击Increase按钮时count增加,计时器函数每2秒调用一次的log(),使用count的值仍然是0。log()成为一个过时的闭包。...); 这就是为什么在状态更新过程中出现的过时装饰问题可以通过函数这种方式来解决。...4.总结 当闭包捕获过时的变量时,就会发生过时的闭包问题。 解决过时闭包的有效方法是正确设置React钩子的依赖项。或者,在失效状态的情况下,使用函数方式更新状态。 ~完,我是小智,我要去刷碗了。

    1.9K30

    简单聊聊G1垃圾回收算法整个流程 --- 理论篇 -- 下

    因此,即使并发标记过程中的暂停处理(根扫描等)延迟开始,也不会产生致命的问题。通过这些可知:在一般情况下(除了堆内空间紧缺时),GC 暂停处理发生的时机是可以调度的。...) 22: # 返回对象转移后新的地址 23: return to 被加入引用队列后,后续被处理的流程: 1: def evacuate(): 2: while $evacuate_queue !...此时对象转移存在两种情况: 如果先转移c1,然后c1旧地址会设置转发标记和转发地址,在转移对象a1的时候,遍历到子对象c1时,发现子对象也位于回收区域内,则加入引用队列等待稍后处理,同时将对象a1...等到后面子对象c1从引用队列取出处理时,将c1转移到新区域后,此时会更新a1指向c1的引用关系,然后返回c1对象新的地址。...再次,它通过将写屏障的处理粒度由对象粒度改为更粗的卡片粒度,降低了写屏障发生的频率。这也是缩短暂停时间的一个手段。 另外,因为有转移,所以区域内不会产生内存碎片。

    71040

    你必须知道的指针基础-6.内存的初始化及结构体的使用

    1.2 解决脏内存区域的办法   那么,如何解决上面我们有可能会访问的脏内存区域呢?...那么,问题来了,为什么是16呢?原来,对于int、short等放到结构体中保存是占用对应的字节,但是对于char*等,则只是保存它的指针(地址)。...三、结构体的拷贝赋值问题 3.1 结构体的复制其实是“深拷贝”   在C语言中,结构体的复制其实就是将整体拷贝一份而不是将地址拷贝一份,这与在.NET中的深拷贝的概念是类似的(深拷贝和浅拷贝是.NET...: %s , p2.Age : %d\n",p2.name,p2.age); printf("Address : %d , %d\n",&p1,&p2);   从下面的运行结果可以看出,即使我们在拷贝后改变了原...p1的age,但p2的age仍为修改之前的值。

    68330

    Power Query 真经 - 第 6 章 - 从Excel导入数据

    “Data” 列显示的是 “Table” 表,其中包含了需要检索到的特定对象的内容。 “Item” 列显示了对象名称的更详细的表示(包括打印区域的工作表名称)。...转到【主页】下【将第一行用作标题】单击【将第一行用作标题】(此时会自动生成一个 “Changed Type” 步骤)。 完成后,数据看起来更干净,如图 6-19 所示。...在这种情况下,“Profit” 将作为列标题出现,而不是 “Column7”。 删除表中那一列存在的无关的数据。在这种情况下,“Column7” 根本就不会出现。...如果发生这种情况,可以通过以下操作来去除它们。 选择数据集中的所有列。 进入【主页】【删除行】【删除空行】。...6.3 关于连接到 Excel 数据的最后思考 在可能的情况下,最好是根据 Excel 表而不是命名区域或工作表来构建解决方案。它比其他方法更容易设置,更容易维护,而且对数据的存储位置相当透明。

    16.6K20

    iOS基础理论(三)

    __block所起到的作用就是只要观察到该变量被 block 所持有,就将“外部变量”在栈中的内存地址放到了堆中。进而在block内部也可以修改外部变量的值。 Block不允许修改外部变量的值。...内部的变量会被 copy 到堆区,“block内部”打印的是堆地址,因而也就可以知道,“定义后”打印的也是堆的地址。...理解到这是因为堆栈地址的变更,而非所谓的“写操作生效”,这一点至关重要,要不然你如何解释下面这个现象: 以下代码编译可以通过,并且在block中成功将a的从Tom修改为Jerry。...超大的公共厕所,大家同时去,程序猿很快就结束了,但程序媛就可能会慢一些,即使你第一个回来,司机也不会出发,司机要等待所有人都回来后,才能出发。...在一个被观察属性发生改变之前,willChangeValueForKey:一定会被调用,这就 会记录旧的值。

    59730

    内存之谜:C语言动态内存管理

    一旦使用 free 释放了内存,该内存区域就不再属于你的程序,你的程序应该停止访问它。如果尝试访问已释放的内存,会导致未定义的行为,通常称为悬挂指针。...,接下来我们讨论realloc调用时会产生的结果 调用 realloc 时,会发生以下几种情况: 原有空间之后没有足够大的空间 原有空间之后有足够大的空间 调整空间失败,返回NULL 情况1 我们想要在已经开辟好的...40个空间后面扩展40个空间,发现后面没有足够的空间 在这种情况下,realloc函数会在内存的堆区重新找一个空间(满足新的空间的大小需求的),同时会把旧的数据拷贝到新的新空间,然后释放旧的空间,同时返回新的空间的起始地址...情况2 在已经开辟好的空间后边,有足够的空间,直接进行扩大,扩大后,返回旧的空间的起始地址; 所以,对于刚刚的代码 int*ptr=(int *) realloc(p,20*sizeof(int...= NULL) { printf("%s\n", str); free(str); // 释放内存 } } 2.使用静态分配:将局部数组改为静态数组 char *

    11710

    MIPS架构深入理解9-向MIPS移植软件之Cache管理

    比如,当从网络上接收到数据后,DMA设备会直接把数据存进内存,大部分MIPS系统不会更新Cache–即使某些Cache行中持有的地址落在DMA传输更新的内存区域中。...为了避免这种情况,你的程序必须在CPU尝试读取落在DMA缓冲区对应地址范围的数据前,主动失效对应Cache行中的内容。应该将DMA缓冲区的边界和Cache行的边界对齐,这样更容易管理。...有些MIPS架构CPU,为了避免显式的回写操作,配置为直写式Cache。但是,这种方案有一个缺点,直写式Cache会造成总体性能上更慢,也会增加系统的电源功耗。...L1级Cache使用虚拟地址作为索引,而使用物理地址作为Tag标签,如果索引的范围大于、等于2个page页,就可能发生Cache重影。...再比如,使用共享内存的时候,多个进程的虚拟地址都可能引用这个数据,如果发生Cache重影,那么也会导致共享内存中的数据不正确。

    1.3K10
    领券