是printf(“%d”,*(++(* a)));未定义

时间:2013-07-09 06:44:19

标签: c

printf("%d",*(++(*a)));未定义?这里a是指向整数的指针。

除此之外我没有其他代码了。它是This问题的扩展,引起了很多困惑。只想知道这个版本中发生了什么。它依赖于Architechture(32 Vs) 64)或编译器版本。

希望答案具有描述性和清晰性。

3 个答案:

答案 0 :(得分:12)

如果你将其分解,它会这样做:

  1. 采用a指向的*a
  2. 增加一++(*a)
  3. 取消引用*(++(*a))
  4. 因此,如果a中存储的值+ 1 是有效指针,则这将起作用。否则,结果未定义,很可能导致运行时错误。

答案 1 :(得分:3)

是的,你的代码是正确的,即使含糊不清也可以产生一些(小)意义:

void print_next(int **a) {
   printf("%d\n",*(++(*a)));
}


int arr[] = {1,5,6,3,5,6};
int *p = arr;

while (p<arr+6) 
   print_next(&p);

答案 2 :(得分:2)

如果你的问题是关于*(++(*a))表达式的,那么这里没有任何未定义的(假设所有涉及的指针都是有效的)。没有尝试对同一对象执行多个修改。没有任何修改对象的独立读取。故事结束。

基本上,这里没有什么可解释的,因为代码在相当直接的方式下完全没问题。实际上没有什么比这更具“描述性和清晰性”的空间了。

如果这还不够清楚,你必须在这个表达式中解释一下你看起来多么可疑。