每当我在Visual Studio中运行此程序时,我都会遇到以下问题。
#include <iostream>
using namespace std;
int* append(int*, int, int*, int);
int* merge(int*, int, int*, int);
void print(int*, int, const char*);
int main()
{
int arrayA[] = { 11,33,55,77,99 }; // use other values for more tests
int arrayB[] = { 22,44,66,88 };
print(arrayA, 5, "Sorted array A: ");
print(arrayB, 4, "Sorted array B: ");
int* arrayC = append(arrayA, 5, arrayB, 4); // arrayC points to the appended array
print(arrayC, 9, "Append B to A: ");
int* arrayD = merge(arrayA, 5, arrayB, 4);
print(arrayD, 9, "Merge A to B: ");
delete[] arrayC;
delete[] arrayD;
return 0;
}
int* append(int* arrayA, int sizeA, int* arrayB, int sizeB)
{
int num = sizeA + sizeB;
int* appendArray = new int[num];
for (int i = 0; i < sizeA; i++)
{
appendArray[i] = arrayA[i];
}
for (int i = sizeA - 1, j = 0; i < (sizeB + sizeA); i++, j++)
{
appendArray[i] = arrayB[j];
}
return appendArray;
}
int* merge(int* arrayA, int sizeA, int* arrayB, int sizeB)
{
int num = sizeA + sizeB;
int* mergeArray = new int[num];
int i = 0, j = 0, k = 0;
do
{
if (arrayA[i] <= arrayB[j])
{
mergeArray[k] = arrayA[i];
i++;
k++;
}
else
{
mergeArray[k] = arrayB[i];
j++;
k++;
}
} while (k < sizeof(mergeArray));
return mergeArray;
}
void print(int* array, int size, const char* lable)
{
cout << lable;
for (int i = 0; i < size; i++)
{
cout << array[i] << " ";
}
cout << endl;
}
此程序当前输出:
Sorted array A: 11 33 55 77 99
Sorted array B: 22 44 66 88
Append B to A: 11 33 55 77 22 44 66 88 -858993460
Merge A to B: 11 44 33 66 55 88 77 -858993460 -842150451
我也不知道为什么。
预期输出为:
Sorted array A: 11 33 55 77 99
Sorted array B: 22 44 66 88
Append B to A: 11 33 55 77 99 22 44 66 88
Merge A to B: 11 22 33 44 55 66 77 88 99
1条答案
按热度按时间s4n0splo1#
这不一定是对您的直接回答,但更一般地是关于为什么不在当前的C++中使用“C”样式数组的回答。
不推荐使用这样的“C”样式数组,因为客户端代码不知道三件事。
One:merge/append的客户端代码将不知道返回的指针指向数组还是int,该信息将丢失。
Two:如果返回的指针是指向数组的指针,则大小丢失。
三:客户端将不知道他必须在返回的指针上调用delete。所有权信息丢失。
那么在当前的C中(naked)new/delete的使用应该被最小化。当你可以的时候尝试使用vector这样的容器。如果你仍然需要分配内存,使用
std::make_unique
/std::unique_ptr
。为了给予您一个概念,这是使用当前C及其标准库的类似代码。
(1)(2)第一个