2016-07-31 58 views
-1

在下面的例子中,在賦值時取消引用不會顯示malloc的任何錯誤,怎麼回事?爲什麼解除引用與malloc的行爲不同?

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

int main() { 
    int *p; 
    printf("%d", &p); 
    int a = 10; 
    *p = a; 
    printf("%d", *p); 
    free(p); 
    return 0; 
} 

without malloc

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

int main() { 
    int *p = (int*)malloc(sizeof(int)); 
    printf("%d", &p); 
    int a = 10; 
    *p = a; 
    printf("%d", *p); 
    free(p); 
    return 0; 
} 

with malloc

+0

請幫助我真的很困惑在指針 – harry

+0

請格式化代碼引導與4個空格的行。還要非常小心地正確格式化代碼,以便易於遵循。我在編輯中對此進行了通過,但是您可以仔細檢查一下,看看我是否錯過了任何內容。 – jaydel

+0

請不要大喊標題 –

回答

4

在第一個例子,是p未初始化。通過*p解引用其值,將調用未定義的行爲。

在第二個示例中,p被分配了一個由malloc()返回的指針。 pNULL,並且取消引用會調用未定義的行爲,或者p爲內存塊保存有效地址,該地址塊足以存儲int並正確對齊任何類型。因此解引用p來存儲a的值被定義,而第二個printf將打印10

在這兩種情況下打印的第一張printf都未定義。地址&p不適用于格式爲%d的適當類型,行爲未定義。

您可以通過將其更改爲printf("%p\n", (void*)&p);來修復此代碼,但它會打印本地變量p的地址。

你可能打算寫printf("%p\n", (void*)p);這將打印包含在p的實際地址,而且這也將發生未定義行爲在第一種情況下,因爲p是未初始化的並且可以包含一個陷阱表示。

+0

關於如何打印指針值:http://stackoverflow.com/documentation/c/3750/formatted-input-output/12982/printing-the-value-of-a-pointer-to-an-object#t= 201607311741210873583 – alk

+0

@harry:如果此答案有用,您可以通過單擊答案分數下方的灰色複選標記來接受該答案。 – chqrlie

相關問題