指针给出意想不到的值

时间:2013-10-16 11:37:54

标签: c arrays pointers

我正在阅读c。

中的理解指针

我在这里找到了一个程序。

#include<Stdio.h>
#include<conio.h>
int main()
{
    static int arr[]={97,98,99,100,101,102,103,104};
    int *ptr=arr+1;
    printf("\nThe base Address is:%u\n",arr);
    print(++ptr,ptr--,ptr,ptr++,++ptr);
    return getch();
}

print(int *a,int *b,int *c,int *d,int *e)
{
      printf("%d  %d  %d  %d  %d",*a,*b,*c,*d,*e);
}

该程序是完美的,我认为它必须生成以下输出:99 99 98 98 100。 但它提供以下输出:100 100 100 99 99

我无法理解帮助我理解它。

2 个答案:

答案 0 :(得分:4)

除了未指定函数参数的评估顺序外,该程序还运行了几个具有未定义行为的项目:

  • 它尝试在到达下一个序列点之前访问带有副作用的表达式的值(它在print的调用中多次执行),并且
  • 尝试使用%u格式说明符打印指针。

编写程序的方式可以打印任何内容,不打印任何内容,甚至崩溃:这是导致未定义行为的后果。

如果您希望参数的评估按特定顺序排列,请引入临时变量,并按顺序执行评估,如下所示:

#include<stdio.h>
#include<conio.h>
int main()
{
    static int arr[]={97,98,99,100,101,102,103,104};
    int *ptr=arr+1;
    printf("\nThe base Address is:%p\n",(void*)arr);
    int *tmp0 = ++ptr;
    int *tmp1 = ptr--;
    int *tmp2 = ptr;
    int *tmp3 = ptr++;
    int *tmp4 = ++ptr;
    print(tmp0, tmp1, tmp2, tmp3, tmp4);
    return getch();
}
print(int *a,int *b,int *c,int *d,int *e)
{
      printf("%d  %d  %d  %d  %d",*a,*b,*c,*d,*e);
}

答案 1 :(得分:2)

print(++ptr,ptr--,ptr,ptr++,++ptr);

是未定义的行为,因为C标准未指定评估参数的顺序。