我正在學習結構和鏈表。不過,我面臨的一個問題是,我無法調試我的程序的錯誤,因爲它來自於函數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。因爲變量曾經返回的函數。 –