我的问题是拥有此代码:
int size=4384;
char buffer[size];
codifyDHCPmessage(buffer, message, size);
其中message是一个只包含char []的结构,而函数返回缓冲区,结构中的所有字段。
我测试它通过缓冲区数组,并检查所有字段是否正常。
但我的问题是,如果我再次将该缓冲区传递给新函数:
decodifyDHCPmessage(buffer,messageAux, size);
我在该函数中做的第一件事就是检查缓冲区的大小,它只告诉我4,当它被假定为4384 ....我不知道为什么。
我必须告诉我,我不是C的专家,指针和内存分配问题对我来说很难。
提前多多感谢。
答案 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指针 - 。