在下面的代码中,当我试图释放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;
}
答案 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;
}