繁体   English   中英

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

[英]pointer passed by address not being updated in C

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

#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条件为true之后)。 我不知道为什么这种行为。 请帮我哪里错了。

如果需要更多信息,也请告知。

供您参考,我正在将gcc与Eclipse kepler和内置调试器一起使用(希望我相信它是gdb)。 以上观察是由调试器在eclipse中进行的。

您必须通过引用传递payload指针,并在STRIP_CONTAINER函数中取消引用它。 在您的原始呼叫中,您正在传递payload的值。 这意味着您将在STRIP CONTAINER的调用堆栈中创建payload的副本,并对该副本进行操作,而不是“原始”操作。 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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM