我正在学习结构和链表。不过,我面临的一个问题是,我无法调试我的程序的错误,因为它来自于函数printf
,这是我用来调试程序的。它看起来像一个printf使我的程序bug
下面的程序工作正常:
struct pointer_struct
{
struct new_struct *ptr;
};
struct new_struct
{
int i;
struct new_struct *ptr;
};
void init(struct pointer_struct *pointer, int nb)
{
struct new_struct my_struct;
my_struct.i = nb;
my_struct.ptr = NULL;
pointer->ptr = &my_struct;
}
int main(void)
{
struct pointer_struct pointer;
pointer.ptr = NULL;
init(&pointer, 15);
//printf("pointer.ptr = %p\n", pointer.ptr);
printf("pointer.ptr->i = %d\n", pointer.ptr->i);
}
输出:
pointer.ptr->i = 15
但只要我去掉了注释行,i
需要怪异值。以下是一些输出示例:
$./a.out
pointer.ptr = 0x7fffc6bcc650
pointer.ptr->i = -448723664
$./a.out
pointer.ptr = 0x7fffd09ed480
pointer.ptr->i = 1218512176
$./a.out
pointer.ptr = 0x7ffff630fa70
pointer.ptr->i = -1073674960
printf
怎么回事?
'的init(结构pointer_struct *指针,INT NB)'使用本地变量'结构new_struct my_struct;'在'指针 - >的ptr =&my_struct;'其中在函数结束后是_pointless_(坏双关语)。 – chux
你的意思是指针'pointer.ptr',它被赋予了这个局部变量的地址的值,指向一个地址,其中*有一个变量,由于printf,这个变量可能不在这里了吗? – nounoursnoir
*指向有变量的地址*是。 *这可能不在这里*确切地说。 *因为printf *不,不是因为printf。因为变量曾经返回的函数。 –