我正在开发一个动态分配项目,我得到一个测试用例的持续意外答案。输出始终打印出“尺寸测试: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;
}
答案 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++;
}