[英]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.