【问题标题】:Dereferencing an incremented pointer causing the pointer to change its value?取消引用导致指针更改其值的递增指针?
【发布时间】:2017-01-09 04:49:35
【问题描述】:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
    int *x= 0;
    int y = 0;
    x = &y;
    *x = 1;
    printf("%i\n",x);//an address 
    printf("%i\n",*x);//1
    *(x+1)=10;
    printf("%i\n",x);//10 ---->unexpected
    printf("%i\n",x+1);//14 ---->more wierd
    printf("%i\n",*(x+1));//seg fault
    return 0;
}

在这种情况下,最后一个 printf 语句将输出一个段错误。 *(x+1)=10 后 x 的值变为 10。但是 *(&y+1) 的值确实更改为 10。语句 *(x+1)=10 不应该影响 x imo。

【问题讨论】:

  • 您应该使用%p 说明符打印地址,并且在执行此操作时必须将指针转换为(void *)。但是,*(x + 1) = 10 调用未定义的行为。在那之后,你的程序就不再重要了。
  • 你觉得*(x+1) = 10;应该怎么做?你为什么这么认为?

标签: c pointers dereference


【解决方案1】:

您为指针使用了错误的控制字符串 (%i)

printf("%i\n",x);//10 ---->unexpected

你应该改用%p

printf("%p\n",(void*) x);

对指针 (x + 1) 的访问也会导致未定义的行为,因为初始指针 x 指向单个整数,因此取消引用 (x + 1) 是越界且未定义的。

【讨论】:

  • 最好提一下越界访问*(x+1)
  • x+1 是允许的(你可以在任何东西的末尾指向一个)但它可能不会被取消引用
  • @M.M-- 为了完整起见:您可以指向末尾之后的一个,但不能指向数组对象开头之前的一个。
  • @DavidBowling M.M 所说的很好理解。你说的 - 你能引用出处吗?
  • 非常感谢。我会调查未定义的行为。第一次听说。
猜你喜欢
  • 2015-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-31
  • 2012-04-26
  • 2010-10-25
  • 2013-04-21
相关资源
最近更新 更多