将 "array of pointers" 传递给函数
Passing "array of pointers" to function
我有一个带有指针数组的顶级函数,如下所示:
Membership *mf[5];
for(i=0;i<5;i++)
mf[i]=(Membership*) malloc(sizeof(Membership))
其中 Membership
是一个结构。
到目前为止一切顺利,在调试时,mf
正确显示了所有 5 个实体。问题是当我将该指针数组传递给函数(与指针没有任何关系)时,如下所示:
call_function(*mf)
其中 call_function()
声明如下:
void call_function(Membership mf[5]){
normalize_function(mf[0],slope);
....
normalize_function(mf[5],fuel);
}
在那里,mf
变得毫无用处,长度为 1 而不是 5。我不明白我做错了什么,即使在 searching/reading 关于这个问题并调试了一段时间之后.请帮助我如何更改 call_function()
(不是指针数组)。
编辑:按照建议我对代码做了一些修改。
Edit2:回应 KyleStrand 的回答:call_function()
不能与指针有任何关系,因为该功能实际上将在 FPGA 中实现(VHDL 编码)并且指针存在不必要的复杂性。
当您说 call_function
"can't have anything to do with pointers" 时,不清楚您的意思。看起来函数的最后一个参数是 array of Membership
s,实际上数组被视为非常像 C 中的指针。当你传递 *mf
函数,您正在 取消引用 数组,也就是说,您正在 访问数组的第一个成员 。这不是您想要的,因为 call_function
采用 数组 而不是 数组成员 。 @caveman 的评论是正确的:您应该传递 原始数组 (即不取消引用它)。
您似乎遇到了一些类型问题。这是您应该拥有的格式。这是一个社区维基,因此其他人可以清理和改进。
void call_function (Membership* local_mf[5])
{
Membership* m = local_mf[0];
}
int main (void)
{
Membership* mf[5];
... // malloc, etc, etc.
call_function (mf);
}
请澄清你的问题,从你的问题中不清楚你想做什么。
但是
Membership *mf[5]
是一个数组,其元素是 Membership
类型的指针
如果将 mf
传递给函数,那么您将数组作为参数传递给函数,并且 mf
本身被视为指针。它指向其成员的第一个元素。所以在这种情况下 mf
成为指向其元素中第一个 Membership 指针的指针。
所以函数内部(函数外部也是):
*mf would give you a pointer of type Membership (the first pointer)
*(mf+1) would give you a pointer of type Membersip (the second element)
**mf would give you an element of type membership (the element which the first pointer evaluates to).
你无法获取 mf
的长度或函数内的任何数组,因为如果你将数组作为参数传递,它会被视为函数内的指针,因此如果你执行以下操作:
sizeof(array)/sizeof(first_element)
sizeof(array)
函数内部将始终等于指针的大小,根据您的系统,指针大小为 4 或 8 个字节。
因此,如果您使用 sizeof(mf)/sizeof(Membership*)
来获取函数内 mf
的长度,则意味着 8/8
或 4/4
始终等于 1。
我有一个带有指针数组的顶级函数,如下所示:
Membership *mf[5];
for(i=0;i<5;i++)
mf[i]=(Membership*) malloc(sizeof(Membership))
其中 Membership
是一个结构。
到目前为止一切顺利,在调试时,mf
正确显示了所有 5 个实体。问题是当我将该指针数组传递给函数(与指针没有任何关系)时,如下所示:
call_function(*mf)
其中 call_function()
声明如下:
void call_function(Membership mf[5]){
normalize_function(mf[0],slope);
....
normalize_function(mf[5],fuel);
}
在那里,mf
变得毫无用处,长度为 1 而不是 5。我不明白我做错了什么,即使在 searching/reading 关于这个问题并调试了一段时间之后.请帮助我如何更改 call_function()
(不是指针数组)。
编辑:按照建议我对代码做了一些修改。
Edit2:回应 KyleStrand 的回答:call_function()
不能与指针有任何关系,因为该功能实际上将在 FPGA 中实现(VHDL 编码)并且指针存在不必要的复杂性。
当您说 call_function
"can't have anything to do with pointers" 时,不清楚您的意思。看起来函数的最后一个参数是 array of Membership
s,实际上数组被视为非常像 C 中的指针。当你传递 *mf
函数,您正在 取消引用 数组,也就是说,您正在 访问数组的第一个成员 。这不是您想要的,因为 call_function
采用 数组 而不是 数组成员 。 @caveman 的评论是正确的:您应该传递 原始数组 (即不取消引用它)。
您似乎遇到了一些类型问题。这是您应该拥有的格式。这是一个社区维基,因此其他人可以清理和改进。
void call_function (Membership* local_mf[5])
{
Membership* m = local_mf[0];
}
int main (void)
{
Membership* mf[5];
... // malloc, etc, etc.
call_function (mf);
}
请澄清你的问题,从你的问题中不清楚你想做什么。
但是
Membership *mf[5]
是一个数组,其元素是 Membership
类型的指针如果将 mf
传递给函数,那么您将数组作为参数传递给函数,并且 mf
本身被视为指针。它指向其成员的第一个元素。所以在这种情况下 mf
成为指向其元素中第一个 Membership 指针的指针。
所以函数内部(函数外部也是):
*mf would give you a pointer of type Membership (the first pointer)
*(mf+1) would give you a pointer of type Membersip (the second element)
**mf would give you an element of type membership (the element which the first pointer evaluates to).
你无法获取 mf
的长度或函数内的任何数组,因为如果你将数组作为参数传递,它会被视为函数内的指针,因此如果你执行以下操作:
sizeof(array)/sizeof(first_element)
sizeof(array)
函数内部将始终等于指针的大小,根据您的系统,指针大小为 4 或 8 个字节。
因此,如果您使用 sizeof(mf)/sizeof(Membership*)
来获取函数内 mf
的长度,则意味着 8/8
或 4/4
始终等于 1。