【问题标题】:printf is producing an unusual response [duplicate]printf 正在产生不寻常的响应[重复]
【发布时间】:2020-08-22 05:06:06
【问题描述】:

我正在练习指针算术,但 printf 语句的响应令人困惑。我的理解说首先应该打印 101,然后应该发生增量。但是问题出在这里...

#include <stdio.h>

int main()
{
int a[] = {101, 276, 345};
int *ptr = a;
printf ("%d\n%d\n", *ptr, *(++ptr) );
return 0;
}

它产生以下输出

276
276

但是,当我将代码更改为以下时

#include <stdio.h>

int main()
{
int a[] = {101, 276, 345};
int *ptr = a;
printf ("%d\n", *ptr);
return 0;
}

结果如下

101

【问题讨论】:

  • 据我所知,答案应该是 101 276
  • 欢迎来到 Undefined Behavior - 在printf ("%d\n%d\n", *ptr, *(++ptr) ); 中,ptr 的值是不确定的,因为没有定义参数的评估顺序——评估的顺序是不定。 ++ptr 是先申请还是先申请? printf ("%d\n%d\n", *a, *(++ptr) ); 会很好。
  • 这与指针运算关系不大。如果你打印这样的整数,你会遇到同样的问题。
  • 停止在其行为一目了然难以理解的“聪明”代码中。将其分解为更小的步骤,通常使用更多的临时变量。

标签: c linux printf pointer-arithmetic


【解决方案1】:

++ptr 改变原来的指针,试试ptr + 1 代替++ptr

#include <stdio.h>

int main()
{
int a[] = {101, 276, 345};
int *ptr = a;
printf ("%d\n%d\n", *ptr, *(ptr + 1) );
return 0;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-28
    • 2014-04-28
    • 2016-02-01
    • 1970-01-01
    • 2016-01-13
    • 1970-01-01
    • 2020-06-17
    • 2013-01-09
    相关资源
    最近更新 更多