-3

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

我没有除此之外的其他代码。它是这个问题的扩展,它造成了很多混乱。只想知道这个印刷品中发生了什么。它取决于架构(32 Vs 64)或编译器版本。

希望答案是描述性的和清晰的。

4

3 回答 3

12

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

  1. 取指向的值:a*a
  2. 加一++(*a)
  3. 取消引用*(++(*a))

因此,如果 存储的值+1a是一个有效的指针,这将起作用。否则,结果是未定义的,很可能会导致运行时错误。

于 2013-07-09T06:48:01.713 回答
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);
于 2013-07-09T06:56:11.703 回答
2

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

基本上,这里没有什么可解释的,因为代码以一种相当直接的方式非常好。真的没有比这更“描述性和清晰”的空间了。

如果这还不够清楚,您必须解释在此表达式中对您来说究竟是什么可疑之处。

于 2013-07-09T06:57:10.910 回答