我创建了以下结构:
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的另一种方法是什么?
答案 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