1

我创建了以下结构:

typedef struct {
  char name[15];
  int ID;
} Employee;

typedef Employee Item;

typedef struct {
  Item items[5];
  int size;
} List;

我从使用此函数填充这些字段的文件中获取值:

void Insert (Item I, int position, List *L){

  int i, LastPos;

  LastPos = Length(L)-1;
  if((LastPos) >= position){
    for(i = 0; i < (LastPos - position); i++){
      L->items[i-(LastPos+1)] = L->items[LastPos-i];
    }
  }

  L->items[position] = I;   
  L->size = L->size+1;
}

当位置变量不同时(IE,尚未放置的变量),则没有问题,我可以打印出保存的值 EG:

在位置 0 处插入名称 Stacy ID 1928502

在位置 1 插入姓名 Jimmy ID 1290589

当我为他们的姓名和 ID 号调用打印功能时,它们被打印出来了。

但是,如果我在位置 0 插入 Jimmy,他的信息会打印得很好但是,每次 EG:ID 变为 32767 时,Stacy's 都会显示为随机内存位置。为什么当我覆盖已经采取的位置时会发生这种情况甚至虽然我有一个循环,它应该重新分配被覆盖信息的位置(列表中的一个空格)。

4

1 回答 1

1

让我们检查一下这个表达式:

L->items[i-(LastPos+1)]

如果Length()返回2(当前在数组中的项目数),那么LastPos + 1应该是2. 现在当循环开始时,iis 0,这意味着i - (LastPost + 1)等于0 - 2which is -2。不是您通常在数组中使用的索引。

我建议你反过来,从最后一项循环到第一项:

for (int i = Length(L) - 1; i >= position; --i)
    L->items[i + 1] = L->items[i];
于 2013-09-25T05:18:35.603 回答