带有realloc的免费2d char数组

时间:2016-08-24 13:37:49

标签: c arrays free realloc

在下面的代码中,当我试图释放2D字符数组的各个元素(即2dArray [l])时,我收到一个错误(_crtisvalidheappointer(puserdata)dbgheap.c): 有关错误原因的任何想法吗?

#include<stdio.h>
int main(){    
    char ** TwodArray= NULL;
    int k = 0;
    int j = 0;

    do{
        k++;
        for (int i= 0; i<10; i++){
            j++;
            TwodArray=(char**)realloc(TwodArray, (j+1)*10*sizeof(char*));
            TwodArray[j-1]=(char*)malloc(10 *sizeof(char));
            TwodArray[j-1] = "abcdefgh";
            ....
        }        
    }while(k<3)
    // free the memory
    for (int l = 0; l < j; l++){
        if (TwodArray[l] != NULL)
            free(TwodArray[l]); // here I get the error!
    }
    free(TwodArray);
    return 0;
}

3 个答案:

答案 0 :(得分:1)

您正在尝试释放静态字符串。

如果你写的话

char* a = "hello";

a未指向动态内存区域。它是静态的,所以你无法释放它。

答案 1 :(得分:0)

TwodArray[j-1] = "abcdefgh";

接着是

free(TwodArray[l]);   // with l = j -1 from above  

将失败,因为TwodArray[j-1]的值未指向由malloc分配的内容

你想做什么:

strcpy(TwodArray[j-1], "abcdefgh");

解释是TwodArray[j-1] = "abcdefgh";更改指针TwodArray[j-1]的值,而strcpy(TwodArray[j-1], "abcdefgh");将字符串"abcdefgh"复制到TwodArray[j-1]指向的位置(和保留TwodArray[j-1]的值不变。

代码失败的示例

#include<stdio.h>
#include<stdlib.h>
int main (void)
{
  char* p = malloc(10 * sizeof(char));
  printf("%p\n", (void*)p);
  p = "aaaa";                  // Bad....
  printf("%p\n", (void*)p);
  free(p);
  return 1;
}
  

可能的输出

     

0x1b76010

     

0x400688

     

* ./a.out'出错:free():无效指针:0x0000000000400688 *

     

中止

工作代码示例

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

int main (void)
{
  char* p = malloc(10 * sizeof(char));
  printf("%p\n", (void*)p);
  strcpy(p, "aaaa");
  printf("%p\n", (void*)p);
  printf("%s\n", p);
  free(p);
  return 1;
}
  

可能的输出

     

0x1d2c010

     

0x1d2c010

     

AAAA

答案 2 :(得分:-1)

简而言之,不要使用静态字符串:

char *a = "aaaa";
free(a)

会导致同样的错误。

这将有效:

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

int main(){
    char ** TwodArray= NULL;
    int k = 0;
    int j = 0;

    do{
        k++;
        for (int i= 0; i<10; i++){
            j++;
            TwodArray=(char**)realloc(TwodArray, (j+1)*10*sizeof(char*));
            TwodArray[j-1] = strndup("abcdefgh",8);
        }
    }while(k<3);
    // free the memory
    for (int l = 0; l < j; l++){
        if (TwodArray[l] != NULL)
            free(TwodArray[l]); // here I get the error!
    }
    free(TwodArray);
    return 0;
}