【问题标题】:Indirection and Increment Operator evaluvation间接和增量运算符评估
【发布时间】:2014-11-07 08:01:05
【问题描述】:
#include <stdio.h>

int main() {
    int op9=9;
    int op99=99;
    int op999=999;
    int op9999=9999;

    int *ptr1=&op9,*ptr2=&op99,*ptr3=&op999,*ptr4=&op9999;

    *ptr1++;
    ++*ptr2;
    (*ptr3)++;
    *++ptr4;

    printf("%d=ptr1 \t %d=ptr2 \t %d=ptr3 \t %d=ptr4",ptr1,ptr2,ptr3,ptr4);

    printf("\n %d = *ptr++ \n %d = ++*ptr \n %d = (*ptr)++ \n %d = *++ptr",*ptr1,*ptr2,*ptr3,*ptr4);

    printf("\n \n  %d=ptr1 \t %d=ptr2 \t %d=ptr3 \t %d=ptr4",ptr1,ptr2,ptr3,ptr4);

    return 0;
}

这是我得到的输出

-

    209002336=ptr1   -209002344=ptr2     -209002348=ptr3     -209002348=ptr4

-209002348 = *ptr++ 
     100 = ++*ptr 
     1000 = (*ptr)++ 
     1000 = *++ptr4

      -209002336=ptr1    -209002344=ptr2     -209002348=ptr3     -209002348=ptr4

为什么 *ptr++ 是 ptr1 指向 ptr3 的地址? 为什么*++ptr4的值1000是ptr3的值?

我认为 *ptr1++ 将指向下一个地址,因为它不是我程序的一部分,所以我预计程序会崩溃。同样,*++ptr4 也应该做同样的事情,因为它被评估为 *(++ptr4)。

那么对于 *ptr++ 和 *++ptr,增量和间接运算符究竟是如何工作的呢?

【问题讨论】:

  • 完全荒谬的问题,除非它们是数组等,否则无法了解几个不同指针的内存位置。不适合这种情况,你看到的根本不是C相关的!!!
  • 另外,要打印指针,我们使用%u 格式说明符!
  • @shekharsuman: %p 用于打印指针,通常为十六进制。 %u 用于大小可能与指针大小不匹配的无符号整数。 (不过,您可能会选择%zu。)
  • @MOehm-Ahh,我同意!我错过了,因为我有使用%u 的习惯,这显然在任何时候都可能不合适!谢谢...

标签: c pointers


【解决方案1】:

解释1000 = *++ptr4

正式地说,这是未定义的行为。

实际上,局部变量是在堆栈中以相反的顺序连续分配的:

int op9;    // SP+3
int op99;   // SP+2
int op999;  // SP+1
int op9999; // SP+0

因此,通过获取指向 op9999 的指针并将其递增,它最终指向 op999

请记住,根据 C 语言标准,它仍然是未定义的行为。

这实际上意味着您在使用不同的编译器时可能会得到不同的结果。

【讨论】:

  • 谢谢你说得通。
  • @Abi:不客气,欢迎点击旁边的 V 来接受答案 :)
【解决方案2】:

你问:

为什么*ptr++ptr1 指向ptr3 的地址?

首先,

*ptr++;

相同
 *(ptr++)

表达式的副作用是 ptr 递增,指针被取消引用,被取消引用的值被丢弃。在增加 ptr 后取消引用它本身就是导致未定义行为的原因。之后得到的任何东西都可能不可靠。

至于为什么ptr指向ptr3的地址,我不知道你为什么这么认为。您的输出似乎没有表明这一点。

你也问过,

为什么*++ptr4 的值是ptr3 的值1000?

表达式*++ptr4 也有同样的问题。您正在递增 ptr4,并取消引用递增的指针。您从取消引用该指针中得到的结果是导致未定义行为的原因,因此是不可预测的。

根据堆栈的组织方式,ptr4 很有可能在递增后指向与 ptr3 相同的地址。但是,不要指望这种巧合的行为。

【讨论】:

  • 所以基本上它是一个依赖于编译器的问题。问题是每次我编译它时,我都会遇到相同类型的问题。感谢您的回复。
  • @Abi,是的,这是一个依赖于编译器的问题。当您使用不同的优化级别时,它也会发生变化。
【解决方案3】:

您的代码中ints 的相对内存顺序未定义。使用数组将它们按升序排列:

int op[] = {9, 99, 999, 9999};
int *ptr1 = &op[0], *ptr2 = &op[1], *ptr3 = &op[2], *ptr4 = &op[3];

要打印指针,请使用%p 格式说明符。

【讨论】:

    猜你喜欢
    • 2018-09-13
    • 2017-04-18
    • 1970-01-01
    • 1970-01-01
    • 2015-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多