C++指针无法更改其原始值

C ++ pointers cannot change their original values

本文关键字:原始 指针 C++      更新时间:2023-10-16

以下代码片段:

bool pinger::unpack(icmp *packet, int iphdrlen, int recv_len, char *buf)
{
if ((recv_len - iphdrlen) < 8)
{
return false;
}
packet = (struct icmp *)(buf + iphdrlen);
std::cout << (int)packet->icmp_type << std::endl;
return true;
}
int pinger::echo()
{
int packet_id = generate_indetity();
int recv_len = 0;
timeval send_timeval, recv_timeval;
socklen_t *addr_len = (socklen_t *)malloc(sizeof(sockaddr *));
char buffer[PACKET_BUFFER_SIZE];
icmp *icmp_packet = (icmp *)buffer;
int packsize = pack(icmp_packet, ICMP_ECHO, 0, 0, packet_id, data_len);
sendto(sock_fd, buffer, packsize, 0, (sockaddr *)&dest_sockaddr, sizeof(sockaddr)
memset(buffer, 0, PACKET_BUFFER_SIZE);
recv_len = recvfrom(sock_fd, buffer, PACKET_BUFFER_SIZE, 0, (sockaddr *)&dest_sockaddr, addr_len);
ip *ip_packet = (struct ip *)buffer;
int iphdrlen = ip_packet->ip_hl << 2;
std::cout << (int)icmp_packet->icmp_type << std::endl;
if (unpack(icmp_packet, iphdrlen, recv_len, buffer))
{
std::cout << (int)icmp_packet->icmp_type << std::endl;
}
}

其输出为:

$ 69
$ 0
$ 69

为什么不能通过指针传递 icmp 结构来修改icmp_packet的值?

修改后,可以通过C++引用传递来修改icmp_packet的值,但为什么不能传递指针呢?

为了在函数中修改某些内容,您需要传递指向正在修改的事物的指针或引用。如果要修改的内容是指针,则需要将指针(或引用(传递给指针

请记住,默认情况下,所有参数都是按值传递的,这意味着调用函数时使用的值将复制到函数中的局部参数变量中。

修改此类副本(例如,通过赋值(仅修改局部变量(副本(,而不修改在调用中使用的变量。

要解决这个问题,您需要通过引用传递这些参数:

// Pass this argument by reference
//                        v
bool pinger::unpack(icmp *& packet, int iphdrlen, int recv_len, char *buf)

我还建议您传递buf作为指向常量字节(char const*或更常见的const char *(的指针,以强制执行函数不会修改数据的约定。