要动态更改数组大小,可以使用重新分配() http://www.cplusplus.com/reference/cstdlib/realloc/常规。除了更容易使用之外,它还比调用的方法更快free()
and malloc()
依次。
确保重新分配的块将填充旧内存块的内容。
问题是在 addNumber 函数中代码有效并且 *a 具有新数组的正确值
您的代码中有两个主要缺陷。第一个是你你的addNumber()
例程不返回新分配的内存块(因此它被泄漏),您应该使用双指针或返回新块作为函数结果。
第二个是第一个的结果 - 之后a
已被释放,你继续写信给它。
如果您希望坚持当前的方法,则此修改后的代码应该可以工作:
void addNumber(int** a, int* size, int number)
{
*size = *size + 1;
int* temp = (int*)(calloc(*size, sizeof(int)));
int i, j = 0;
for(i = 0; i < *size-1; i++) {
if((*a)[i] < number) {
printf("add ai");
temp[j] = (*a)[i];
j++;
} else {
printf("add number");
temp[j] = number;
}
}
if(j != *size) {
printf("add new number");
temp[j] = number;
}
free(*a);
*a = temp;
}
int main(int argc, char* argv[])
{
int n = 10;
int* a;
int size = 1;
a = (int*) (calloc(1, sizeof(int)));
a[0] = 1;
if(!contains(a, size, 2)) {
addNumber(&a, &size, 2);
}
printArray(a,size);
return 0;
}