void SeqListInsertByPos(SeqList* pList, size_t pos, DateType x)
{
assert(pList != NULL && pos <= pList->_size);
if (IsFull(pList))
printf("顺序表已满,无法正常进行插入\n");
else
{
for (int i = pList->_size - 1; i >= pos; --i)
{
pList->base[i + 1] = pList->base[i];
}
pList->base[pos] = x;
++pList->_size;
}
}
这是我在实现顺序表过程中所实现的顺序表的按位置插入的一个功能,然而在测试对下标为0的位置进行插入的时候,却发现出现了异常错误。
在VS2019的调试窗口中,我发现在for循环中i的值从pList->_size - 1逐渐减小至0,但是它没有按照我的想法停下来,而是继续减了下去,这个时候我意识到事情不是像看上去那么的简单。
后来我发现,在我定义的循环中,i是int型,但pos是size_t类型。int型再与size_t类型比较过程中,会先把int类型转换为无符号类型再做比较。当出现负数,比如-1时,对应的无符号是4294967295,所以程序会陷入无限循环之中,而在我的顺序表中,自然也发生了越界,造成了访问出错的异常。
所以我的正确解决方式应为:
void SeqListInsertByPos(SeqList* pList, size_t pos, DateType x)
{
assert(pList != NULL && pos <= pList->_size);
if (IsFull(pList))
printf("顺序表已满,无法正常进行插入\n");
else
{
for (int i = pList->_size - 1; i >= (int)pos; --i)
{
pList->base[i + 1] = pList->base[i];
}
pList->base[pos] = x;
++pList->_size;
}
}