C指针在循环中的奇怪行为

C指针在循环中的奇怪行为,c,pointers,C,Pointers,对于使用gcc-Wall-pedantic-std=c99-gbug.c编译的以下代码,我看到了以下奇怪的结果 #include<stdio.h> #include<stdlib.h> typedef struct node_ { int key; } node; void add (node** cur, node* n) { if(*cur) { printf("%p %p\n", (void *)*cur, (void *)n); p

对于使用gcc-Wall-pedantic-std=c99-gbug.c编译的以下代码,我看到了以下奇怪的结果

#include<stdio.h>
#include<stdlib.h>

typedef struct node_ {
  int key;
} node;

void
add (node** cur, node* n)
{
  if(*cur)
  {
    printf("%p %p\n", (void *)*cur, (void *)n);
    printf("%d %d\n", (*cur)->key, n->key);
  }
  *cur = n;
}

int
main()
{
  node* previous = 0;
  char k[] = {1, 2, 3};
  /* add(&previous, &(node){k[0]}); */
  /* add(&previous, &(node){k[1]}); */
  /* add(&previous, &(node){k[2]}); */
  /* puts(""); */
  for(int i=0; i<3; ++i)
    add(&previous, &(node){k[i]});
}
通过展开的循环,我看到了正确的外观

0x7ffdae8c72d0 0x7ffdae8c72e0
1 2
0x7ffdae8c72e0 0x7ffdae8c72f0
2 3

for(int i=0;i
for(int i=0;i您获取的是一个临时变量的地址。这是UB。@OliverCharlesworth为什么是UB?@melpomene:好吧,在它的生命周期之后取消引用它当然是!@OliverCharlesworth当然可以,但是获取一个复合文本的地址本身就很好,就像任何其他局部变量一样。您获取的是一个临时变量的地址。这是s UB.@OliverCharlesworth为什么是UB?@melpomene:好吧,在它的生命周期之后取消引用它当然是!@OliverCharlesworth当然可以,但是获取复合文字的地址本身是很好的,就像任何其他局部变量一样。
0x7ffdae8c72d0 0x7ffdae8c72e0
1 2
0x7ffdae8c72e0 0x7ffdae8c72f0
2 3
for(int i=0; i<3; ++i)
    add(&previous, &(node){k[i]});
for(int i=0; i<3; ++i) {
    node tmp = { k[i] };
    add(&previous, &tmp);
}