gpt4 book ai didi

c++ - 动态分配数组的地址会根据数组的声明方式而变质吗?

转载 作者:行者123 更新时间:2023-11-28 06:32:30 26 4
gpt4 key购买 nike

下面的代码似乎在数组声明为 like 时有效

int numbers[3]

但是当我尝试声明它时

int* numbers = new int[3];

调整大小后,调整后的数组的前两个数字似乎丢失了。我真的无法弄清楚这两个声明之间有什么区别。任何澄清都会有所帮助。

int main() {
int numbers_size = 0;
int numbers_capacity = 3;
//works when declared like this
//does not work when declared like int* numbers = new int[3]
int numbers[3];
do {
...
if(numbers_capacity == numbers_size)
numbers_capacity = resize_array(numbers, numbers_size);
}while(numbers[numbers_size - 1] != 0);
return 0;
}

int resize_array(int* arr, int arr_size) {
int* temp = new int[arr_size];
for(int i = 0; i < arr_size; i++)
temp[i] = arr[i];
delete [] arr;
arr = new int[4*arr_size];
for(int i = 0; i < arr_size; i++) {
arr[i] = temp[i];
}
delete [] temp;
return 4*arr_size;
}

最佳答案

您正在更改 arr 的值在resize_array指向新的内存位置,但调用函数仍然具有旧的、现在悬空的内存位置。

将函数更改为:

int* resize_array(int* arr, int arr_size)
{
int* temp = new int[arr_size];
for(int i = 0; i < arr_size; i++)
temp[i] = arr[i];

delete [] arr; // This makes pointer in the calling function
// point to deleted memory.

arr = new int[4*arr_size];
for(int i = 0; i < arr_size; i++) {
arr[i] = temp[i];
}
delete [] temp;

// Return the newly allocated memory.
return arr;
}

并像这样使用它:

numbers_capacity = numbers_size*4; // This is bad. It assumes that
// that you are increasing the size by 4 times.

numbers = resize_array(numbers, numbers_size);

您可以简单地使用 std::vector<int>并避免所有头痛。

关于c++ - 动态分配数组的地址会根据数组的声明方式而变质吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27300787/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com