-1

我的问题是有这个代码:

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

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

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

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

decodifyDHCPmessage(buffer,messageAux, size);

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

我不得不说我不是 C 方面的专家,指针和内存分配问题对我来说很难。

提前非常感谢。

4

4 回答 4

4

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

于 2012-04-13T10:00:52.613 回答
3

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

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

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

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

然后打电话给你codifyDHCPmessage。最后,decodifyDHCPmessage你可以在里面做

unsigned sz = strlen(buffer);
于 2012-04-13T10:01:21.127 回答
2

我怀疑您的函数签名如下所示:

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

(或类似的)

问题是[]在函数签名中真的意味着*char[]即是真的char*。换句话说,数组参数衰减为一个大小为 4 的指针,这并不奇怪。

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

于 2012-04-13T10:01:03.787 回答
0

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

于 2012-04-13T10:02:42.060 回答