在结构中释放数组时出错

时间:2014-03-02 04:42:58

标签: c arrays struct malloc free

我正在处理一个包含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有关,但是如何?感谢

1 个答案:

答案 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

您将获得有关此内容的更多信息。