2014-09-25 62 views
0

我認爲,一旦你在一個內存位置使用free(),該內存返回到內存,如果你要寫入該位置後釋放,這將是未定義的行爲?這是我的老師的代碼。有人可以解釋他在做什麼嗎?我不明白他爲什麼要寫給剛剛釋放的記憶。謝謝!有人可以解釋什麼這個代碼涉及免費()實際上

void initialize(char ***subjects, char***courses, int **CRNs, int *size) 
{ 
    int i; 

    *subjects = (char**) malloc (INITIAL_COURSE_SIZE * sizeof(char*)); 
    *courses = (char**) malloc(INITIAL_COURSE_SIZE * sizeof(char*)); 
    *CRNs = (int*) malloc(INITIAL_COURSE_SIZE * sizeof(int)); 

     for(i = 0; i < INITIAL_COURSE_SIZE; i++) 
     { 
     (*subjects)[i] = (char*) malloc(SUBJECT_SIZE * sizeof(char)); 
     (*courses)[i] = (char*) malloc(COURSE_SIZE * sizeof(char)); 
     } // for i 

    *size = INITIAL_COURSE_SIZE; 
} // initalize() 


void resize(char ***subjects, char***courses, int **CRNs, int *size) 
{ 
    int i, *CRNs2, size2 = *size * 2; 
    char **subjects2, **courses2; 


    subjects2 = (char**) malloc (size2 * sizeof(char*)); 
    courses2 = (char**) malloc(size2 * sizeof(char*)); 
    CRNs2 = (int*) malloc(size2 * sizeof(int)); 

    for(i = 0; i < *size; i++) 
    { 
    subjects2[i] = (*subjects)[i]; 
    courses2[i] = (*courses)[i]; 
    CRNs2[i] = (*CRNs)[i]; 
    } // for i 

    free(*subjects); //WHY DOES HE FREE THIS?????? 
    free(*courses); 
    free(*CRNs); 
    *subjects = subjects2; 
    *courses = courses2; 
    *CRNs = CRNs2; 

    for(; i < size2; i++) 
    { 
    (*subjects)[i] = (char*) malloc(SUBJECT_SIZE * sizeof(char)); 
    (*courses)[i] = (char*) malloc(COURSE_SIZE * sizeof(char)); 
    } // for i 

    *size = size2; 
} // resize() 

而且,如果我做的事:

char **a; 
a = (char*)malloc(sizeof(char*) * 100); 

難道一個指向整個數組a []?例如,一個[0]和一個[1] ...將是字符指針。指向malloc'd char *的整個塊還是僅指向[0]?謝謝!我真的很感謝幫助!

+0

首先問問自己,「調整大小」的典型用例是什麼......然後你得到了答案。 – 2014-09-25 09:15:03

+0

還沒有讀剩下的,但你的註釋釋放和寫入不是UB,因爲釋放的是指向的指針,而不是指針本身。 – Medinoc 2014-09-25 09:16:29

+2

你的老師應該教人們[不要轉換'malloc()']的返回值(http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc)。 – unwind 2014-09-25 09:36:47

回答

1

resize功能基本上重新調整給定的內存塊,讓他們兩次它們的大小(size2 = *size * 2

下正在發生的事情:

  • 新的內存分配的調整大小的塊
  • 指針到課程和'CRN'被複制到新的存儲器中,舊的存儲器塊被釋放。這是而不是 free()舊內存塊指向的塊!所以新的列表仍指向有效的(未刪除的)塊。
  • 新塊的附加部分(由它們的指針填充的學科和課程數據新分配的內存)

注意,所有功能參數包含一個額外*因此新的內存塊,並初始化大小是'返回'(並可以在應用程序的其餘部分使用)。

關於你的第二個問題,關於

char **a; 
a = (char*)malloc(sizeof(char*) * 100); 

achar* -pointers與分配列表100 只有長的列表,列表中的項目是不確定指針。要初始化這些項目以及您可以使用:

for(int i = 0; i < 100; i++) { 
    a[i] = malloc(SIZE_OF_CHAR); 
} 

現在所有的項目指向char*大小爲SIZE_OF_CHAR

+0

你的意思是列表是100個元素的數組嗎?我的問題是,是否指向100個元素的數組?或者只是第一個元素。謝啦!!欣賞它。 – 2014-09-25 09:22:28

+0

是'a'指向數組(它包含未定義的指針,直到您按照我的最後一個示例代碼中所示來定義它們)。 'a [0]'指向第一個數組元素。 – Veger 2014-09-25 09:24:06

+0

嘿丹,當我的老師做的時候:*科目=科目2;他是否將數組主題2分配給雙指針主題,還是隻分配subject2 [0]的地址或什麼?謝謝。 – 2014-09-25 09:35:39

相關問題