当我将数组作为函数参数传递时,为什么指针会丢失它的引用? C

时间:2012-04-13 09:58:55

标签: c

我的问题是拥有此代码:

int size=4384;
char buffer[size];
codifyDHCPmessage(buffer, message, size);

其中message是一个只包含char []的结构,而函数返回缓冲区,结构中的所有字段。

我测试它通过缓冲区数组,并检查所有字段是否正常。

但我的问题是,如果我再次将该缓冲区传递给新函数:

decodifyDHCPmessage(buffer,messageAux, size);

我在该函数中做的第一件事就是检查缓冲区的大小,它只告诉我4,当它被假定为4384 ....我不知道为什么。

我必须告诉我,我不是C的专家,指针和内存分配问题对我来说很难。

提前多多感谢。

4 个答案:

答案 0 :(得分:4)

当作为参数传递给函数时,静态堆栈数组'衰减'为普通旧指针。然后发生的是,使用sizeof获取指针的大小,而不是数组。您需要将数组大小作为另一个参数传递。

答案 1 :(得分:3)

当一个数组传递给一个函数时,实际上传递了指向它基址的指针。现在,如果对它应用sizeof,它只返回4,即32位系统上指针的大小。

如果你真的想要buffer中的字符数,你需要确保它在传递之前是空的终止,然后在被调用的函数中,使用类似strlen的东西来计算大小或你必须在调用者本身(定义数组并且sizeof正常工作)中计算数组大小,然后将其发送到要调用的函数。

您已经将数组的大小作为参数发送。 但是如果想知道数组中实际个字符数,那么你可以这样做 -

int size=4384;
char buffer[size];
memset(buffer, 0, size);

然后拨打您的codifyDHCPmessage。最后,在decodifyDHCPmessage内,您可以

unsigned sz = strlen(buffer);

答案 2 :(得分:2)

我怀疑你的功能签名是这样的:

void codifyDHCPmessage(char[], message_t, size_t);

(或类似)

问题在于,函数签名中的[]实际上意味着*,即char[]实际上是char*。换句话说,数组参数衰减为一个指针,其大小不出所料,为4。

据我所知(但我可能错了......),C根本不允许你将数组传递给函数,它只支持指针。这就是为什么你需要将大小作为一个明确的单独参数传递的原因。

答案 3 :(得分:0)

在C / C ++中,缓冲区参数作为指针传递给函数==>它以字节为单位返回sizeof指针 - 。