【问题标题】:Address Incrementation of Double pointer and Single pointer双指针和单指针的地址递增
【发布时间】:2020-12-04 15:58:24
【问题描述】:

当指向指针变量(双指针)的指针在初始化后递增时,如果我们访问它的值会给出运行时错误。而在指针变量的情况下,如果我们在递增后访问它的值会给出垃圾值。我正在努力理解这种行为的可能原因是什么?

使用双指针:

#include<stdio.h>
int main(void)
{
    int  i=10;
    int *j=&i;
    int **k=&j;
    k++;
    printf("%d ",**k);
    return 0;
}

输出:运行时错误

使用单指针:

#include<stdio.h>
int main(void)
{
    int  i=10;
    int *j=&i;
    j++;
    printf("%d ",*j);
    return 0;
}

输出:垃圾值

【问题讨论】:

  • 第二种情况是垃圾值,第一种情况是垃圾地址。当您取消引用 that 时,它会很痛。它们都是未定义的行为,所以任何事情都可能发生。
  • @WeatherVane 您之所以说这是未定义的行为,是因为我们正在访问两个程序的未初始化内存。我说的对吗?
  • 这是未定义的行为,主要是因为取消引用不在原始对象内的地址是非法的,无论它是否以某种方式初始化。在第一种情况下,result 是访问不允许的内存。在第二种情况下,它是垃圾。

标签: c pointers


【解决方案1】:

当您将指针加 1 时,它将指向下一个内存地址,在本例中为原始地址“右侧”的 4 个字节。那里可能有一个值,或者可能有绝对垃圾,或者您正在运行的程序不允许读取该地址。您无法事先知道这一点,因此您会得到相当不确定的行为。

【讨论】:

  • 确实知道这一点(作为一个 C 程序员你应该知道),因为 C 标准是这么说的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-02
  • 1970-01-01
  • 2012-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多