读书人

严蔚敏 数据结构 数组的顺序表示 有关

发布时间: 2012-11-03 10:57:44 作者: rapoo

严蔚敏 数据结构 数组的顺序表示 问题

C/C++ code
#include <stdio.h>#include <stdarg.h>#include <malloc.h>#define    OK    1#define    ERROR    0#define    MAX_ARRAY_DIM 8typedef struct  {    int *base;    //数组的基地址,初始化时分配    int dim;        //数组的维数    int *bounds;    //数组每一维的长度    int *constants;    //数组映象函数常量基址}array;int init_array(array *a, int dim, ...){    int i = 0;    int elem_num = 1;        //记录数组中元素的个数    va_list ap = NULL;    if(dim < 1 || dim > MAX_ARRAY_DIM)    {        return ERROR;    }    a->dim = dim;    a->bounds = (int *)malloc(dim * sizeof(int));    if(!(a->bounds))    {        return ERROR;    }    va_start(ap, dim);    for(i = 0; i < dim; i++)    {        a->bounds[i] = va_arg(ap, int);        if(a->bounds < 0)        {            return ERROR;        }        elem_num *= a->bounds[i];    }    va_end(ap);    a->base = (int *)malloc(sizeof(elem_num * sizeof(int)));    if(! (a->base))    {        return ERROR;    }         a->constants = (int *)malloc(dim * sizeof(int));    if(!(a->constants))    {        return ERROR;    }    a->constants[dim - 1] = 1;    for(i=dim-2; i>=0; i--)    {        a->constants[i] = a->constants[i+1] * a->bounds[i+1];        }    return OK;}int destory_array(array *a) {    if(a->base)    {        free(a->base);                     //  <<<<<<<<================这里    }    else        return ERROR;    if(a->bounds)    {        free(a->bounds);    }    else        return ERROR;    if(a->constants)    {        free(a->constants);    }    else        return ERROR;    return OK;}int locate_array_elem(array a, va_list ap, int *offset){    int i = 0;    int curdim = 0;    for(i = 0; i < a.dim; i++)    {        curdim = va_arg(ap, int);        if(curdim < 0 || curdim >=a.bounds[i])        {            return ERROR;        }        *offset += a.constants[i] * curdim;    }    return OK;}int get_array_elem(int *e, array a, ...){    va_list ap;    int result = 0;    int offset = 0;        va_start(ap, a);    if(!(result = locate_array_elem(a, ap, &offset)))    {        return ERROR;    }    va_end(ap);    *e = *(a.base + offset);    return OK;}int assign_array_elem(int e, array *a, ...){    va_list ap;    int result = 0;    int offset = 0;    va_start(ap, a);    if(!(result = locate_array_elem(*a, ap, &offset)))    {        return ERROR;    }    va_end(ap);    *(a->base + offset) = e;    return OK;}int main(int argc, char *argv[]){    array arr;    int dim = 3;    int bound1 = 2, bound2 = 3, bound3 = 4;    //arr[2][3][4]数组    int i = 0, j = 0, k = 0;    int assign_elem = 0;    int get_elem = 0;    int *p = NULL;    init_array(&arr, dim, bound1, bound2, bound3);    printf("array[%d][%d][%d] : \n", bound1, bound2, bound3);    for(i = 0; i < bound1; i++)    {        for(j = 0; j < bound2; j++)        {            for(k = 0; k < bound3; k++)            {                assign_elem = i * 100 + j * 10 + k;                assign_array_elem(assign_elem, &arr, i, j, k);                get_array_elem(&get_elem, arr, i, j, k);                printf("array[%d][%d][%d]=%-4d", i, j, k, get_elem);            }            printf("\n");        }        printf("\n");    }    destory_array(&arr);        return 0;}

程序在最后的destory_array()处释放空间的时候出错了,哪里有问题?
附两张运行结果图片,一个是在vs2010,一个是在gcc




[解决办法]
正在看中,顶一个,继续看
[解决办法]
a->base = (int *)malloc(sizeof(elem_num * sizeof(int)));
多了一个sizeof

读书人网 >C语言

热点推荐