计算阵列中已分配的内存时出现意外输出

时间:2014-02-02 19:15:39

标签: c pointers multidimensional-array struct dynamic-data

我正在开发一个动态分配项目,我得到一个测试用例的持续意外答案。输出始终打印出“尺寸测试:11”,我无法弄清楚原因。

getSize()遍历所有值并添加到计数中,如果它不是NULL(实际上,计算数组中的所有有效元素)。

我正在使用getSize()作为回退,因为ArrayList大小的var无法正确输出。此外,使用calloc()创建并引用test的数组是古怪的。如果我执行for循环打印所有值,它会在中途停止并崩溃(在大小为25的数组的情况下,它会在索引7之后一直停止。)但是,如果我打印了索引,如果seg因为循环错误,它完美无缺。逻辑是错误的,还是我必须冲洗一些东西?

如果我将测试用例更改为数组大小更大或更大的位置,那么在打印出常量int的情况下会发生同样的情况。

typedef struct ArrayList
{
    // We will store an array of strings (i.e., an array of char arrays)
    char **array;

    // Size of list (i.e., number of elements that have been added to the array)
int size;

    // Length of the array (i.e., the array's current maximum capacity)
    int capacity;

} ArrayList;

int main(void){
    struct ArrayList *test;
    test=createArrayList(25);
    int i=getSize(test);
    printf("test of size: %d", i);
    return 0;
}

//creates the array list and allocated memory for it
ArrayList *createArrayList(int length){
    struct ArrayList *r = malloc(sizeof(*r));
    if (r == NULL)//Returns null if malloc does not work
        return NULL;
    length=(length<DEFAULT_INIT_LEN) ? DEFAULT_INIT_LEN: length;//figures which value is         greater and keeps it
    r->array=calloc(sizeof(char), (length+1));
    if (r->array == NULL){//returns null if malloc does not work
            printf("error\n");
            return NULL;
    }
    r->size = 0;
    r->capacity = length;
    printf("Created new ArrayList of size %d.\n", length);
    return r;
}
//the function im having trouble with
int getSize(ArrayList *list){
    int i=0, count=0;//index variables
    if (list->array==NULL)
        return -1;
    for (i=0; i<(list->capacity-1); i++){//goes through all indexs of internal array and     conuts valid elements. this is where im having trouble specifically
        if (list->array[i]!=NULL)
            count++;
    }
    return count;
}

2 个答案:

答案 0 :(得分:0)

这是错误的:

r->array=calloc(sizeof(char), (length+1));

它应该是sizeof(char *),因为你为char指针数组分配了空间。或者,更好的是,根本不要硬编码数组元素的类型,而是使用*r->array代替:

r->array = calloc(sizeof(*r->array), length+1);

您分配length+1个元素然后只能capacity-1中的getSize()感觉有点奇怪。我想你只想要length

答案 1 :(得分:0)

在我看来,这部分试图索引不存在的列表元素:

for (i = 0; i < (list->capacity - 1); i++)
{
    if(list->array[i] != NULL)
        count++;
}

也许这对你想要完成的事情更好:

while (list->array[i++] != NULL)
{
    count++;
}