2014-04-01 109 views
0

兩者均顯示23。但是兩者有什麼區別?這兩個代碼片段有什麼區別?

代碼-1

main() 
{ 
    int *ar[10]; 

    **(ar+0) = 23; 
    printf("%d", **(ar+0)); 

    return 0; 
} 

代碼2

main() 
{ 
    int *ar[10]; 

    *(ar+0) = (int*) malloc(sizeof(int)); 
    **(ar+0) = 23; 
    printf("%d", **(ar+0)); 

    return 0; 
} 
+1

不錯的作業問題;) – blue

+1

在第一個代碼中**(ar + 0)= 23;'調用[未定義行爲](http://en.wikipedia.org/wiki/Undefined_behavior) –

+0

你怎麼看?當你運行它們時會發生什麼?你爲什麼認爲其中之一可能會導致你的電腦崩潰並燒燬? – Lundin

回答

1

第一個是未定義的行爲。它將a定義爲一個由10個指向整數的指針組成的數組,但在寫入中使用第一個指針(a[0])之前不會初始化這些指針。這是未定義的行爲。

第二個首先將指針設置爲返回值malloc()(帶有really bad cast),因此它有更好的機會不調用UB。當然,如果分配失敗並返回NULL,那麼它又是一個未定義的行爲。

+0

我的(int *)malloc()強制轉換不可接受? –

+0

is this better ?: main() { \t int * ar [10]; \t \t ar [0] = malloc(sizeof(int)); \t * ar [0] = 5; \t printf(「%d」,* ar [0]); \t return 0; } –

+1

@DaveBlack你點擊鏈接,閱讀關於強制'malloc()'的返回值嗎?不,我不認爲這是可以接受的。是的,沒有演員的變體當然更好。使用'ar [0] = malloc(sizeof * ar [0]);'去除重複的類型會更好。另外,很少真正分配那麼小的內存。 – unwind

3
int *ar[10]; 
**(ar+0) = 23; 

這是未定義行爲(分配23一些「隨機」的內存),因爲你沒有分配給這個23 INT元空間(ar是一個指針數組)。


INT * AR [10]; (ar + 0)=(int)malloc(sizeof(int)); printf(「%d」,**(ar + 0));

分配內存爲 int在第一 ar元件,但應該 打印「垃圾」,因爲這 int未初始化。

隨着問題被編輯並添加了初始化:第二個版本非常好(如果malloc成功)。


*(ar+0)相同ar[ 0 ]

+0

請更新您的答案 - 問題已以不兼容的方式更新。 –

+0

@mic_e - 謝謝,更新。 –

+1

注意:如果'malloc()'成功,則實現僅爲文件。 –

0

兩個樣品先指定的10個整數指針的數組。

第一個樣本然後繼續寫入到第一個指針的值 - 甚至沒有分配它。這是未定義的行爲,很可能會出現段錯誤。

第二個示例爲第一個指針分配內存,然後在那裏寫入一個值。它具有完美定義的行爲。也就是說,如果malloc()成功,您需要檢查。