你能解释一下为什么第一个函数不能正常工作吗?
我写了两个相同的函数:
bool push_front(int value, size_t *size, int **arr) {
if (!*arr) return false;
int *new_arr = realloc(*arr, sizeof(int[*size + 1]));
if (!new_arr) return false;
new_arr[0] = value;
for (size_t i = 1, j = 0; j < *size; ++i, ++j)
new_arr[i] = (*arr)[j];
++*size;
*arr = new_arr;
return true;
}
bool push_front(int value, size_t *size, int **arr) {
if (!*arr) return false;
int *new_arr = malloc(sizeof(int[*size + 1]));
if (!new_arr) return false;
new_arr[0] = value;
for (size_t i = 1, j = 0; j < *size; ++i, ++j)
new_arr[i] = (*arr)[j];
++*size;
free(*arr);
*arr = new_arr;
return true;
}
第一个确实添加了一个元素,但它也将所有数组元素重写为“值”。有什么想法为什么会发生吗?
第一种使用
realloc
的方法有多个问题:
(*arr)[i]
:如果块被重新分配到不同的地址,*arr
可能是无效指针。value
。这是修改后的版本:
bool push_front(int value, size_t *size, int **arr) {
if (!*size && !*arr) {
int *new_arr = malloc(sizeof(int));
if (!new_arr)
return false;
} else {
if (!*arr)
return false;
int *new_arr = realloc(*arr, sizeof(int[*size + 1]));
if (!new_arr)
return false;
for (size_t i = *size; i > 0; i--)
new_arr[i] = new_arr[i - 1];
}
new_arr[0] = value;
++*size;
*arr = new_arr;
return true;
}