2017-04-20 35 views
-1

我正在尝试使用realloc减小char **双指针的大小。 首先char **指针分配使用malloc,然后个人char*指针如下所示。如果我使用realloc减少char **指针的大小,它是否会在内部释放减小大小的个别char *指针

char **first= (char**)malloc(num*sizeof(char*)); 
    char **last=(char**)malloc(num*sizeof(char*)); 

    for(int i=0;i<num;i++) 
    { 
    //each individual pointer holds 20 characters 
      first[i]=(char*)malloc(20*sizeof(char)); 
      last[i]=(char*)malloc(20*sizeof(char)); 

    } 

现在一些操作后,我想通过一个计数器值,其中计数器小于num减少第一个和最后的大小。
目的是释放最后的计数器记录数。

如果我下面

//Freeing up internal pointer memories 
     i = 0; 
     while (i<counter) 
     { 
      free(first[num1-1 - i]); 
      free(last[num1-1-i]); 
      i++; 
     } 

    //Reducing the size of the double pointer using realloc 
     first = (char **)realloc(first, (num1-counter) * sizeof(char *)); 
     last = (char **)realloc(last, (num1-counter) * sizeof(char *)); 

在此之后,如果我打印的记录

for(i=0; i<num - counter; i++){ 
     printf("First Name: %s ",first[i]); 
     printf("Last Name: %s ",last[i]); 
    }` 

的最后一条记录似乎已损坏。

如果我只是执行以下操作并且不释放个人char *指针,它工作正常。

first = (char **)realloc(first, (num1-counter) * sizeof(char *)); 
last = (char **)realloc(last, (num1-counter) * sizeof(char *)); 

我的问题是没有一个双指针的realloc缩小尺寸,内部节省了内部指针和为我做这两个,这是一些如何堕落的记忆?

+3

您正在使用正确的技术。这听起来像你的代码在其他地方有一个错误。请发布[MCVE](http://stackoverflow.com/help/mcve) –

+1

[不要在C中投射malloc](http://stackoverflow.com/q/605845/995714) –

+0

用'num完成分配','free()'用'num1'完成。用'num1'完成重新分配。用'num'完成打印 - >嗯? – chux

回答

1

回答你的问题:不,它没有。

如果指针仍在其他地方使用,释放char **中的嵌套指针可能会失败。

的C编译器不遵循内存指针周围,也不指望对象引用,所以它是由你来free(或保留)的char **内嵌套的字符串分配的内存。

至于示例代码本身,它似乎有问题,但这些在你的问题的评论中描述。