我正在处理一个包含int和int数组的结构
这是我的两个功能:
//stores array of char numbers in array of ints
//returns pointer to SomeStruct
SomeStruct *fromString(char *str){
/*get string length*/
int length = strlen(str);
SomeStruct *huge;
huge = malloc(sizeof(SomeStruct));
/* incase malloc() fails */
if ( huge == NULL) {
return NULL;
}
huge->length = length;
huge->digits = malloc((sizeof(int))*length);
/*store chars as ints*/
int i;
for(i=0;i<length;i++){
if (str[i] == ""){
huge->digits[i] = 0;
}
if (str[i] == '0'){
huge->digits[i] = 0;
}
if (str[i] == '1'){
huge->digits[i] = 1;
}
if (str[i] == '2'){
huge->digits[i] = 2;
}
if (str[i] == '3'){
huge->digits[i] = 3;
}
if (str[i] == '4'){
huge->digits[i] = 4;
}
if (str[i] == '5'){
huge->digits[i] = 5;
}
if (str[i] == '6'){
huge->digits[i] = 6;
}
if (str[i] == '7'){
huge->digits[i] = 7;
}
if (str[i] == '8'){
huge->digits[i] = 8;
}
if (str[i] == '9'){
huge->digits[i] = 9;
}
}
return huge;
}
和
//frees mem
//returns NULL ptr to struct
SomeStruct *destroy(SomeStruct *p){
/*free each cell*/
int i;
for(i=0;i<getLength(p);i++){
free(p->digits[i]);
}
/*free p & return NULL*/
free(p);
p=NULL;
return p;
}
以及我的样本main()
int main(){
SomeStruct *z;
z = malloc(sizeof(SomeStruct));
z = fromString("100100987654321");
//printcheck
int i;
for(i=0;i<getLength(z);i++){
printf("%d", z->digits[i]);
}
printf("\n");
destroy(z);
return 0;
}
编译之后,我得到100100987654321的正确打印输出,但是一旦它命中了destroy函数,我就会得到以下错误:对象0x2的malloc: * 错误:没有分配被释放的指针。
我玩破坏功能并且单独使用free(p)不会抛出错误,但是当我尝试释放数组中的任何内容(p-&gt;数字)时,我会收到该错误消息。我假设错误与fromString函数中的malloc有关,但是如何?感谢
答案 0 :(得分:0)
问题在于:
/*free each cell*/
int i;
for(i=0;i<getLength(p);i++){
free(p->digits[i]);
}
您不想释放每个单元格,您希望立即释放所有单元格。上面应该替换为
free(p->digits);
记住你分配内存的方式是:
huge->digits = malloc((sizeof(int))*length);
您没有为digits
的每个元素分配不同的指针,因此无需单独释放每个元素。
如果您使用的是unix / linux系统,请在终端:
man 3 malloc
man 3 free
您将获得有关此内容的更多信息。