C 通行证;指针数组“;发挥作用
我有一个带指针数组的top函数,如下所示:C 通行证;指针数组“;发挥作用,c,arrays,pointers,C,Arrays,Pointers,我有一个带指针数组的top函数,如下所示: Membership *mf[5]; for(i=0;i<5;i++) mf[i]=(Membership*) malloc(sizeof(Membership)) call_function(*mf) void call_function(Membership mf[5]){ normalize_function(mf[0],slope); .... normalize_function(mf[5],fuel
Membership *mf[5];
for(i=0;i<5;i++)
mf[i]=(Membership*) malloc(sizeof(Membership))
call_function(*mf)
void call_function(Membership mf[5]){
normalize_function(mf[0],slope);
....
normalize_function(mf[5],fuel);
}
其中调用函数()
声明如下:
Membership *mf[5];
for(i=0;i<5;i++)
mf[i]=(Membership*) malloc(sizeof(Membership))
call_function(*mf)
void call_function(Membership mf[5]){
normalize_function(mf[0],slope);
....
normalize_function(mf[5],fuel);
}
在那里,mf
变得毫无用处,长度为1而不是5。我无法理解我做错了什么,即使是在搜索/阅读了相关内容并调试了一段时间之后。请帮助我更改调用函数()
(不是指针数组)
编辑:根据建议,我对代码做了一些更改
Edit2:回应KyleStrand的回答:
call_function()
与指针没有任何关系,因为该函数实际上将在FPGA(VHDL编码)中实现,指针存在不必要的复杂性。当你说call_function
与指针没有任何关系时,不清楚你的意思。函数的最后一个参数似乎是一个成员
s的数组,实际上数组被视为非常类似于C中的指针。当您将*mf
传递给函数时,您正在取消对数组的引用,也就是说,您正在访问数组的第一个成员。这不是您想要的,因为call\u函数
接受数组而不是数组成员@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);
}
请澄清您的问题,您的问题不清楚您想做什么 但是 是一个数组,其元素是类型成员的指针 如果将
mf
传递给函数,则将数组作为参数传递给函数,并且mf
本身被视为指针。它指向其成员的第一个元素。因此在本例中,mf
成为指向其元素中第一个成员身份指针的指针
因此在函数内部(也在函数外部):
无法获取函数中的mf
或任何数组的长度,因为如果将数组作为参数传递,它将被视为函数中的指针,因此如果执行以下操作:
sizeof(array)/sizeof(first_element)
sizeof(array)
函数内部的大小始终等于指针的大小,根据您的系统而定,指针的大小为4或8个字节
因此,如果您在函数中使用
sizeof(mf)/sizeof(Membership*)
来获取mf
的长度,这意味着8/8
或4/4
始终等于1。在调用函数时不要取消对mf的引用,即调用函数(…,mf)。该声明不应该是void call\u函数吗(…,Membership[5]);
,也就是说,它不应该期望一个类型为Membership
的数组(因为mf
不是一个类型)?@JoãoPereira显示了实际代码,我觉得这里有些可疑。我只是想说数组是指向内存地址的指针的语法糖。因此,当OP说函数可以与指针无关,但却将数组传递给函数时,这导致了一个矛盾“指向5个成员资格的连续数组中的第一个元素的指针”(也称为Membership mf[5]
)不能直接转换为“指向5个指针的连续数组中的第一个元素的指针,每个指针指向单个成员资格”(也称为Membership*mf[5]
),反之亦然。