1

我创建了以下结构:

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

typedef Employee Item;

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

我正在使用这个函数调用来查看列表中存储的内容:

void Peek (int position, List *L, Item *X);

该函数应在 [位置] 获取列表 [L] 中的项目并将其地址复制到 [X]。我有这个 peek 功能:

void Peek (int position, List *L, Item *X) {
  Item *B;
  B = malloc(sizeof(L->items[position]));
  X = B;
}

这会将 X 分配给与 B 相同的位置,但是我认为这会导致内存泄漏,更重要的是,如果我尝试从这个函数中调用我的 main 中的项目 X 的​​ ID:

int EmployeeID (Employee X) {
  return(X.ID);
}

我返回 32665 或类似的东西。从 L 到 X 获取数据的另一种方法是什么?

4

2 回答 2

1

X 和 B 都是指针

X = B 是指针赋值,不是结构赋值

X是传值参数,给函数内部的X赋值对函数外部的X值影响为零。

试试这个(不是解决方案,而是朝着正确方向迈出的一步):

void Peek (int position, List *L, Item **X)
{
  Item *B;
  B = malloc(sizeof(L->items[position]));
  *X = B;
}

但是,L->items[position] 的值仍然没有分配给 X 空间。

选项 2:

void Peek(int position, List *L, Item *X)
{
  *X = L->items[position];
}

这假设 X 已经指向一个 malloc 的内存块。如果不是,选项3

选项 3:

void Peek (int position, List *L, Item **X)
{
  Item *B;
  B = malloc(sizeof(L->items[position]));
  *X = B;
  *B = L->items[position];
}
于 2013-09-24T17:41:13.357 回答
1

“函数应该......将其地址复制到X〜>此代码的问题:

void Peek (int position, List *L, Item *X) {
    Item *B = malloc(sizeof(L->items[position]));
    X = B;
}

是它不会更改作为第三个参数传递的原始指针。您实际需要做的是修改指针本身,因此您需要从函数返回此指针或将其传递为Item**,即指向指针的指针:

void Peek (int position, List *L, Item **X) {
    Item *B = malloc(sizeof(L->items[position]));
    *X = B;
}
...
// and somewhere:
Peek(position, L, &X);              // <-- you should pass an address of pointer
于 2013-09-24T17:41:22.423 回答