gpt4 book ai didi

c++ - 在函数中将数组作为参数传递

转载 作者:太空宇宙 更新时间:2023-11-04 05:57:42 26 4
gpt4 key购买 nike

我有一个函数需要传递一个数组,并且数组值将在该函数中被修改。我是这样实现的,但是函数调用后数组中的值并没有改变。任何人都可以帮助我吗?谢谢!

这是我调用函数 socket.Receive(sender,buffer,sizeof(buffer)) 的地方。变量 buffer 没有得到正确的值。

while ( true )
{
Address sender;
unsigned char buffer[256];
int bytes_read = socket.Receive( sender, buffer, sizeof( buffer) );
if ( !bytes_read )
break;
printf("%d\n",buffer[92]);

}

这是函数socket.Receive()

的代码
int Socket::Receive( Address & sender, 
void* data,
int size )
{
unsigned char packet_data[256];

unsigned int max_packet_size =
sizeof( packet_data );

#if PLATFORM == PLATFORM_WINDOWS
typedef int socklen_t;
#endif

sockaddr_in from;
socklen_t fromLength = sizeof( from );

size = recvfrom( handle,
(char*)packet_data,
max_packet_size,
0,
(sockaddr*)&from,
&fromLength );

data = packet_data;
unsigned int from_address = ntohl( from.sin_addr.s_addr );
unsigned int from_port = ntohs( from.sin_port );

return size;
}

最佳答案

data = packet_data;

在这一行中,您将分配给 data,但 Receive 所采用的参数是指针的本地拷贝。如果你试图改变传递的参数,它需要引用:

int Socket::Receive( Address & sender, 
void*& data, // <-- reference to a pointer
int size )

就像@DrewDormann 所说的那样,赋值不会将数据从packet_data 复制到data,而是更改data 的地址指向packet_data的地址。结果是,当您稍后尝试取消引用 buffer 时,您将获得访问已销毁对象的未定义行为。

相反,应该使用memcpy 来复制数据:

#include <cstring>
std::memcpy(data, packet_data, size);

关于c++ - 在函数中将数组作为参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24194493/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com