2016-02-26 75 views
2

所以我只是想問,這是一個未定義的行爲,當添加註釋行時。雖然沒有編譯錯誤,並且他們都給出了相同的答案。我想知道有沒有什麼區別。地址是否被地址覆蓋。另外如果有人這樣做(即爲b分配內存),memcpy()是一個很好的解決方案。這可能是一個微不足道的例子,但我想了解其中的差異。這是一個未定義的行爲?

#include <stdio.h> 
#include <stdlib.h> 
int main() 
{ 
    int *a; 
    int *b; 
    a=malloc(sizeof(int)); 
    //b=malloc(sizeof(int)); 
    int c=6; 
    a=&c; 
    b=a; 
    printf("%d\n",*b); 
    return 0; 
} 
+4

您有內存泄漏。 –

+2

請注意'a = malloc(sizeof(int)); a =&c;'也會造成內存泄漏。 – MikeCAT

+3

無論有沒有評論,你的程序行爲都很糟糕。定義明確,但不好。 :) –

回答

8

當你取消註釋//b=malloc(sizeof(int));一部分,你最終會創造memory leak,作爲後來,你會失去通過malloc()返回的指針,並沒有辦法free()它。

FWIW,你已經有這個問題與a,爲您的c地址覆蓋malloc()版內存。

它是而不是UB,不過,不管怎麼說,這是一個壞習慣。

對於上面的代碼,您可以安全地刪除malloc() s。你不需要它們。

也就是說,int main()至少應該是int main(void)以符合標準。

+0

一般覆蓋一個mableced內存不好。在需要的情況下,比如如果我想將1個指針(指向結構的指針)分配給另一個,它們是否需要mallocd或爲一個指針分配內存就足夠了? @Sourav Ghosh –

+0

@ArSanSrikanthSridhar是的,這是一個壞主意。等等,在此之前,這是一個誤解的跡象。如果你不需要malloed內存,爲什麼malloc第一? :)你明白了嗎? –

+0

一般來說,我的問題是分配一個malloced內存讓它成爲任何數據類型,當你想將內存分配給另一個相同的數據類型時,必須在分配之前進行配對? –

2
b=malloc(sizeof(int)); 
int c=6; 
a=&c; 
b=a; 

由於b該值的使用之前被改變,您分配的mallocb返回值沒什麼區別。但是,你不要free它,所以你泄漏分配的內存。

沒有UB。

2

我不認爲此代碼會導致未定義的行爲,但此代碼確實會導致內存泄漏。如果您不需要額外的緩衝區,請不要使用malloc()

相關問題