所以我的代码假设将数字插入到动态数组中,如果需要更多数量,则向数组添加更多容量,从数组中删除数字,然后确保在数组末尾只发生NULLS。它还告诉用户数组中有多少个数字以及数组的总大小。我的问题是当我从数组中删除一个数字时,有时会打印出我的数组中有一个数字-33686019。这种情况不会发生太多,但我不希望它发生。
#include <stdio.h>
#include <iostream>
int* gArray = NULL;
int gSize = 0;
int gCapacity = 0;
void Insert(int value);
void Remove(int value);
void Resize(int newCapacity);
void Print(void);
void main()
{
int input = 0;
while(input != 3)
{
printf(">=== Dynamic Array ===\n");
printf("What do you want to do?\n");
printf("1. Insert\n");
printf("2. Remove\n");
printf("3. Quit\n");
printf("Your choice: ");
scanf_s("%d", &input);
printf("\n\n");
int value = 0;
switch(input)
{
case 1:
{
printf("Enter a number: ");
scanf_s("%d", &value);
Insert(value);
Print();
break;
}
case 2:
{
printf("Enter number you wish to delete: ");
scanf_s("%d", &value);
Remove(value);
Print();
break;
}
case 3:
{
break;
}
default:
{
printf("Invalid selection\n");
}
}
}
}
void Insert(int value)
{
bool valueSet = false;
while(valueSet == false)
{
if(gArray == NULL)
{
Resize(1);
gArray[gSize] = value;
++gSize;
valueSet = true;
}
else if(gArray[gCapacity] == NULL)
{
gArray[gSize] = value;
++gSize;
valueSet = true;
}
else if(gArray[gCapacity] != NULL)
{
Resize((gCapacity + 1));
gArray[gSize] = value;
++gSize;
valueSet = true;
}
}
}
void Resize(int newCapacity)
{
int* tempArray = new int[newCapacity];
std::copy(gArray, gArray+(newCapacity-1), tempArray);
gArray = new int[newCapacity];
std::copy (tempArray, tempArray+(newCapacity-1), gArray);
gCapacity = newCapacity;
}
void Remove(int value)
{
for(int i = 0; i < gCapacity; ++i)
{
if(gArray[i] == value)
{
gArray[i] = NULL;
--gSize;
}
}
for(int i = 0; i < gCapacity; ++i)
{
if(gArray[i] == NULL)
{
gArray[i] = gArray[(i + 1)];
gArray[(i + 1)] = NULL;
}
}
}
void Print(void)
{
printf("Array contains: ");
for(int i = 0; i < gCapacity; ++i)
{
if(gArray[i] != NULL)
{
printf("%d, ", gArray[i]);
}
}
printf("size = %d, capacity = %d\n", gSize, gCapacity);
}
答案 0 :(得分:2)
一个选项,因为您使用c ++标准库将删除所有代码,并使用std::list及其insert
和remove
方法。如果您要求数据位于动态数组中,请使用std::vector和erase remove惯用法进行删除。
我必须指出,因为你的问题是“在动态数组中删除int值并将其设置为NULL ”,所以将int设置为NULL
实际上是将其设置为值0
,因为NULL
往往是0
的定义。因此,如果您的列表包含零,则此设置为NULL
并检查与NULL
的相等性将完全破坏算法的逻辑。 C ++ 11有nullptr
,一个无法分配给int的实际null类型来处理这类问题。
答案 1 :(得分:1)
具体问题是您没有在tempArray
函数中初始化新数组(分别为Resize
)。
致电
int* tempArray = new int[newCapacity];
数组可以包含任意值。仅从旧数组复制newCapacity-1
个值,因此最后一个值未定义。它可能是0但不是。使用
std::fill(tempArray, tempArray+newCapacity, 0);
用零初始化数组。
除此之外,还有一些其他问题:
delete[] gArray
。另外tempArray
也不会被删除!gArray = tempArray
(删除旧的gArray
后,请参见上文)newCapacity
比gCapacity
(您从旧数组复制newCapacity-1
值)大1。最好是复制gCapacity
值。0
(根据您的要求)std::vector
而不是任何自行开发的解决方案。修改强>
请参阅@StackUnderflows答案,了解可能是错误的真正原因。如果你在调试模式下运行,一些编译器会自动为你初始化数组,这可能是这里的ccase。
另一方面,gArray[i]=gArray[i+1]
函数中的Remove
行肯定是错误的,因为它访问的值超出了数组的限制。
答案 2 :(得分:1)
当您执行Remove
时,问题发生在gArray[i] = gArray[i + 1]
的第二个循环中的最后一次迭代。在最后一次迭代中,gArray[i + 1]
实际上是数组末尾的一个,因此您现在处于未定义的行为区域。您将此未定义值分配给最后一个元素gArray[i]
。
我建议改用std::vector<int>
。它可以操作引擎盖下的数组,当您添加更多元素时,它会为您增长/调整大小。