地址传递的指针未在C中更新

时间:2014-04-14 17:34:51

标签: c eclipse gdb

我一直试图在下面给出的代码中找出以下问题。

#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中的调试器完成的。

1 个答案:

答案 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);