在C中从struct指针复制到数据库的struct指针

时间:2013-09-24 17:34:45

标签: c pointers data-structures struct

我创建了以下结构:

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]。我有偷窥功能:

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

这会将X分配到与B相同的位置,但是我认为这会导致内存泄漏,更重要的是,如果我尝试从我的主函数中调用项目X的ID,则可以使用此函数:

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

我的回复是32665或其他类似的东西。将数据从L传递到X的另一种方法是什么?

2 个答案:

答案 0 :(得分:1)

X和B都是指针

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

X是一个pass by value参数,为一个函数内的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];
}

答案 1 :(得分: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