【问题标题】:Copying from struct pointer to struct pointer for database in C在C中从结构指针复制到数据库的结构指针
【发布时间】:2013-09-24 17:34:45
【问题描述】:

我创建了以下结构:

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 的另一种方法是什么?

【问题讨论】:

  • 请在您的编译器中启用所有警告和调试信息(例如,Linux 上的gcc -Wall -g);并学习如何使用调试器(例如gdb)。
  • 调试器能否让我判断这是否是逻辑问题?
  • 是的,你需要掌握调试器的使用方法。

标签: c pointers data-structures struct


【解决方案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];
}

【讨论】:

    【解决方案2】:

    "函数应该...把它的地址复制到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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多