2013-01-09 27 views
2

我有一個問題......可以說我有下面的代碼部分:的malloc在for循環

int *a,*a1,*a2; 
for (i=1; i<=2; i++) { 
    a=malloc(sizeof(int)); 
    if (i==1) a1=a; 
    else if (i==2) a2=a; 
} 
*a1=5; 
*a2=4; 

所以我的問題是 如果我用printf打印A1和A2的參量A1是要去值爲5,a2爲值4?所以如果我使用malloc來分配內存和該內存空間中的點並再次使用malloc來分配內存,那麼指向內存的不同部分,但內存的第一部分仍然存在?或者,如果我使用malloc有再次它將抹去的記憶的第一部分,它會寫的內存

+4

您可能需要'if'條件。 – effeffe

+1

又是什麼實際用途?^^ – Vogel612

+0

如果你想打印5和4,你必須分別打印a1和a2。 和你從未初始化* a。未定義的行爲。 –

回答

9

malloc每次調用返回一個指向不同的新內存部分,直到你調用free釋放內存。

+1

nope,malloc的行爲是平臺定義的,你怎麼能這麼說? – user1797612

+0

所以如果我使用malloc來指定一個名爲2的指針,那麼首先創建的內存部分將不會被擦除,因此如果我使用另一個指向oint的指針,我會在末尾有兩個內存空間? – user1809300

+0

@ user1809300對你的問題最好的答案是:malloc是不安全的,不可移植的,你應該避免使用這個函數,考慮採用C++作爲你的主要語言或者記錄你的malloc選擇和更安全的做法 – user1797612

0

我相信你的問題的答案是肯定的。 Malloc'ing將爲您提供(至少)指定大小(如果可用)的內存位置。它不釋放任何內存,只給你更多(使用free()來釋放malloc的內存)。

事實上,你正在使用一些臨時變量a沒有意義。在這個循環結束時a == a2 != a1

3

如果我使用printf來打印a1和a2變量a1要去的值是5而a2的值是4呢?

Erm ... no。

a1(感int *類型,即指針爲整數)將包含地址從所述第一呼叫到malloc()所得。

a2(和a),也正在指針的類型,將包含地址調用malloc()所得。

地址a1將指向的整數,到爲其分配值5

地址a2(和a)將指向的整數,到爲其分配的值4.

這兩個整數將保持分配狀態,直到通過調用free()的地址釋放它們。 小心:你打電話給free(a2),整數不再分配。在同一地址(例如,通過free(a)或通過第二次呼叫free(a2))再次呼叫free()將導致未定義的行爲(即,如果幸運的話,您的程序將崩潰)。

指針是地址值。看起來這是你的困惑來自的地方:它與它指向的東西不一樣。

+0

您確定第一條語句嗎? http://ideone.com/XKKwgd –

+1

@ shiplu.mokadd.im:是的,我確信我的第一個陳述。 'a1'包含值的**地址**,而不是值本身。爲了得到值(5),你必須對指針('* a1')進行**解引用**,就像你的鏈接代碼在賦值中以及'printf()'語句一樣。 – DevSolar

+0

@ shiplu.mokadd。im:試試這個:'printf(「a1 =%d \ n」,a1);'。驚訝嗎? – DevSolar

0

如果我使用printf來打印a1和a2變量a1要去的值是5而a2的值是4呢?

是的,你是對的。不過,這有點奇怪,因爲試着去看看比詢問要容易。

所以,如果我使用malloc在內存空間的分配內存和一個點,再次使用的malloc分配內存然後指向的內存的不同部分,但內存的第一個部分還存在嗎?

這是正確的。 malloc()分配內存「存在」,直到您釋放它使用free()或執行realloc()可能會移動您的數據到不同的內存並釋放舊的內存位置。我建議你閱讀一些關於它的文檔。至少manual page

此外,您的代碼有錯誤。您使用賦值而不是比較,並且變量i未定義。這是一個帶有printf()的更正版本:

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

int main() 
{ 
    int *a,*a1,*a2; 
    int i; 

    for (i=1; i<=2; i++) { 
     a = malloc(sizeof(int)); 
     if (i==1) 
      a1 = a; 
     else if (i==2) 
      a2 = a; 
    } 
    *a1=5; 
    *a2=4; 

    printf("a1=%d, a2=%d\n", *a1, *a2); 

    free(a1); 
    free(a2); 

    return EXIT_SUCCESS; 
} 

希望它有幫助。祝你好運!