【问题标题】:Both &i and p are pointing to the same variable but showing different result? [duplicate]&i 和 p 都指向同一个变量但显示不同的结果? [复制]
【发布时间】:2014-12-31 14:18:27
【问题描述】:

&i(inside main function) 和 p(inside func function) 拥有相同的地址。好吧,我知道不能修改常量对象/变量,但我可以在 func 函数中使用 (*p)++ 递增变量 i,但结果并未反映在主函数中。这是为什么呢?

#include <iostream>
using namespace std;

void func(int *p){
    (*p)++;
    printf("%p %d\n", p, *p);
}

int main(int argc, char **argv){
    const int i = 47;
    const int *p = &i;
    func(const_cast<int *>(p));
    printf("%p %d\n", &i, i);
    return 0;
}

我得到这个输出:

000000000022fe44 48
000000000022fe44 47

【问题讨论】:

  • 当心!这里是龙!
  • 你告诉编译器iconst。它将常量值折叠到 printf arg 中。它没有义务对它那么明智,或者根本不明智。你撒谎了。它依赖于你告诉它的内容。

标签: c++


【解决方案1】:

因为undefined behavior。您正在修改 常量 数据。 const_cast 应该是一个很大的提示。

【讨论】:

  • 他还在一个打印语句中引用了指针,在另一个中引用了内存地址。
【解决方案2】:

在定义时声明为const 的对象确实是const object。这意味着修改该对象的结果是不确定的。

未定义意味着编译器要对您的代码做什么完全取决于编译器。在您的情况下,编译器似乎在只读内存中分配了真正的 const 。当您将此传递给采用非常量指针的函数时,编译器可能已经为该函数提供了另一个包含类似值的内存。但这只是我的猜测。

已编辑以回应@FreeNickName 的评论:-

由于两个指针的地址(一个在 main 中,另一个在 func 中)是相同的,所以我认为上面并没有给出正确/完整的画面。也许编译器只是忽略了增量指令,因为它被应用于只读内存。

【讨论】:

  • 你的解释似乎很有道理,但有趣的是main函数和func函数中的指针值是相同的,所以值不同很奇怪。无论如何,+1)新年快乐! :)
  • @FreeNickname 第一次和你一样...是的,我没注意到这一点。
  • 编译器无法在 R/O 内存中分配常量。如果有,那么语句(*p)++ 将导致访问冲突。它比这更简单:每次使用整数常量的名称作为右值时(例如在对printf 的调用中),编译器都会简单地替换为它的逐字值。
  • @FreeNickname const int i = 47; 是一个常数。当编译器看到这一点时,它可以优化加载值 from i,而是使用您分配给它的任何值。当您在main 中调用printf 时,它正在执行printf("%p %d\n", &amp;i, 47)。当您打印func 中的值时,它不知道它是const 并从内存中加载它。这就是为什么你会得到两个不同的值。
  • 我一直想说这个...谢谢@CaptainObvlious :)
猜你喜欢
  • 2018-06-21
  • 1970-01-01
  • 1970-01-01
  • 2012-12-12
  • 2019-06-03
  • 1970-01-01
  • 1970-01-01
  • 2015-10-19
  • 2021-12-30
相关资源
最近更新 更多