C++指针无法更改其原始值
C ++ pointers cannot change their original values
以下代码片段:
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 *
(的指针,以强制执行函数不会修改数据的约定。
相关文章:
- 从堆栈分配的原始指针构造智能指针
- 将unique_ptr分配给原始指针
- 如何将唯一指针的 std::vector 转换为原始指针的 std::span?
- <Base> <Derived> 具有相同原始指针共享引用的 shared_ptr 和 shared_ptr 实例是否计数?
- C++原始指针和"delete"
- 为什么 C++ 地址中的矢量无法通过原始指针访问
- 如何正确实现具有原始指针的类的复制构造函数?
- 如何在将原始指针移动到基类构造函数之前从unique_ptr中提取原始指针
- 为包含原始指针的对象C++智能指针
- c++:复制、删除和运算符=在原始指针映射中
- C++模板,用于通过常量引用和原始指针传递向量
- C++为什么原始指针不会增加shared_ptr的引用计数?
- 从shared_ptr获取原始指针以将其传递给需要 raw 的函数
- 如何包装多级原始指针以赋予其容器语义
- 为什么我可以通过原始指针而不是shared_ptr来修改对象
- 将原始指针传递给接受unique_ptr作为参数的函数
- 为什么我们不允许将纯引用参数传递给 std::thread,但允许传递原始指针?
- 更改保留指向其字段的原始指针的对象地址
- 从原始指针(衰减的 C 样式数组)和大小生成范围::视图
- 如何在C++代码中灵活使用和替换标准::shared_ptr或标准::unique_ptr或原始指针?