我一直试图在下面给出的代码中找出以下问题。
#define CONTAINER_LENGTH_OFF 0
#define CONTAINER_TYPE_OFF 4
#define CONTAINER_CODE_OFF 6
#define CONTAINER_TRANSACTION_ID_OFF 8
#define CONTAINER_PAYLOAD_OFF 12
void STRIP_CONTAINER(const char *container, uint16_t *type, uint16_t *code, uint64_t *payload_size, char *payload)
{
*type = *( (uint16_t*)(container+CONTAINER_TYPE_OFF) );
*code = *( (uint16_t*)(container+CONTAINER_CODE_OFF) );
if ( (unsigned int)*(container + CONTAINER_LENGTH_OFF) > 12 )
payload = container + CONTAINER_PAYLOAD_OFF;
else
payload = NULL;
*payload_size = *( (uint32_t *)(container + CONTAINER_LENGTH_OFF) ) - CONTAINER_SIZE;
}
int main()
{
char *container = NULL;
uint16_t type;
uint16_t code;
char *payload = NULL;
uint64_t payload_size = 0;
.....
.....
container = malloc(CONTAINER_SIZE + payload_size);
// memory pointed to by the container is populated with required data by following
// code which is not shown for simplicity purposes. And also no other variables,
// declared above, are modified until the function STRIP_CONTAINER() is called below.
.....
STRIP_CONTAINER(container, &type, &code, &payload_size, payload);
.....
}
在上面的代码中,在填充指针“container”指向的内存然后调用函数STRIP_CONTAINER()之后,所有通过地址传递给STRIP_CONTAINER()函数的变量似乎都会根据代码进行更新。对于指针“有效载荷”,即使在赋值之后也保持为0(即使在if条件为真之后)。我想知道为什么这种行为。在我出错的地方请帮助我。
如果需要更多信息,请务必告知。
为了您的信息,我使用gcc与Eclipse kepler和内置调试器(希望我相信它是gdb)。上面的观察是由eclipse中的调试器完成的。
答案 0 :(得分:0)
您必须通过引用传递payload
指针,并在STRIP_CONTAINER
函数中取消引用它。在原始通话中,您传递的值为payload
。这意味着您要在payload
的调用堆栈中创建STRIP CONTAINER
的副本,并在副本上操作而不是“原始”。 STRIP_CONTAINER
终止后副本将丢失。
STRIP_CONTAINER
的函数标题/原型将如下所示:
void STRIP_CONTAINER(const char *container, uint16_t *type, uint16_t *code, uint64_t *payload_size, char **payload)
在您的功能中,您可以正常取消引用payload
并对其进行操作。
然后您的电话可以修改为:
STRIP_CONTAINER(container, &type, &code, &payload_size, &payload);