2014-09-25 59 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

相关问题