C指针在循环中的奇怪行为
对于使用gcc-Wall-pedantic-std=c99-gbug.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
#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;ifor(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);
}