Pet*_*ete 2 c arrays free struct dynamic
我正在努力使用一个C结构,它必须包含一个动态的较小结构数组:
typedef struct issueStruct {
    int data;
} issue;
typedef struct volumeStruct {
    issue* collection;
    size_t elements;
} volume;
我可以在卷结构的数组中动态创建尽可能多的问题结构.我也可以遍历那个数组:
int main(){
    volume* TimeMagazine = (volume*)malloc(sizeof(volume));
    TimeMagazine->collection = (issue*)malloc(4 * sizeof(issue));
    TimeMagazine->elements = 4;
    issue* ptr = TimeMagazine->collection;
    int i;
    // Populate & iterate through array:
    i = 0;
    while(i < TimeMagazine->elements){
            ptr->data = 100*i;
            printf("%d)  %d\n", i, ptr->data);
            i++;
            ptr = ptr+i;       // Advance ptr
    }
    return 0;
}
OUTPUT:
[Linux]$ gcc -Wall magazines.c
[Linux]$ ./a.out
0)  0
1)  100
2)  200
3)  300
[Linux]$
到现在为止还挺好.当我在GDB中逐步完成上述操作时,一切看起来都没问题,尽管我注意到问题结构似乎没有连续的内存地址.这是我看到的内存地址:
issue 0)  0x602030
issue 1)  0x602034
issue 2)  0x60203c
issue 3)  0x602048
这给了我一些停顿; 我会假设所有问题都是4个字节,如sizeof(issue) = 4.更严重的是,当我修改我的"迭代通过"代码以释放数组的元素时,我的代码会出错.具体来说,它在尝试释放第二个问题时出错.这是代码:
    i = 0;
    ptr = TimeMagazine->collection;
    issue* ptr2 = ptr;
    while(i< TimeMagazine->elements){
            printf("freeing %d...\n", i);
            i++;
            free(ptr2);           // free ptr2
            ptr2 = ptr = ptr+i;   // advance ptr & ptr2
    }
这是错误(Linux上的GCC):
*** Error in `./a.out': free(): invalid pointer: 0x000000000137c034 ***
所以我确定我在这里遗漏了一些东西,但不确定是什么.有人可以推荐一种有效的方法来释放()数组元素吗?
非常感谢!
-Pete
PS - 有许多"阵列中的释放结构"帖子,但似乎没有一个与我正在做的完全匹配.所以我发布这个,希望我的这个问题的版本是独一无二的.
while(i < TimeMagazine->elements){
        ptr->data = 100*i;
        printf("%d)  %d\n", i, ptr->data);
        i++;
        ptr = ptr+i;       // Advance ptr
}
您正在使用错误的指针算法ptr = ptr+i,应该是ptr = ptr+1您在边界外访问.该free部分也是如此.
正如@kaylum在评论中所指出的那样:你free在一个循环中调用,这也是错误的,你可以free(TimeMagazine->collection);立刻就可以为4同一个块中的元素保留空间.
| 归档时间: | 
 | 
| 查看次数: | 140 次 | 
| 最近记录: |