我想简单地将char作为参数传递给函数 然后应该由函数修改。 不幸的是,当它像下面的打印输出那样 缓冲区不相等。我不明白,因为我通过了 指向char数组的指针。任何人都看到明显的事情 那是不是?
unsigned char* buffer;
doSomething(buffer)
printout(buffer);
其中doSomething()定义为:
doSomething(unsigned char *buffer)
{
char* receiveddata;
Socket.recv(receiveddata);
buffer = ( unsigned char* ) receiveddata;
printout(buffer);
}
答案 0 :(得分:5)
这里有两个问题:
指针receiveddata
未初始化,因此指向内存中的某个随机位置。这会导致您在某处丢弃数据。
您对buffer
指针所做的更改不会传递到外部。如果你想这样做,你必须使用双指针。
以下是这两个问题的解决方案:
void doSomething(unsigned char **buffer)
{
unsigned char* receiveddata;
// Allocate memory
// Note: You need to know the maximum length of data that you will
// ever receive here.
receiveddata=new unsigned char[MAXIMUM_NUMBER_OF_CHARS_YOU_WILL_RECEIVE];
Socket.recv(receiveddata);
*buffer = receiveddata;
printout(buffer);
}
请注意,此代码容易受到缓冲区溢出攻击,以防有人发送超出预期的数据。你使用什么套接字库?它是否有一种机制可以保护您不要将更多数据写入缓冲区(例如,recv指定缓冲区长度的附加参数)?
你可以这样称呼:
unsigned char* buffer;
doSomething(&buffer);
// Process the data in buffer, then free it when you're done:
delete [] buffer;
然而,正如其他人所指出的那样,自己管理内存分配和删除是很麻烦的。看一下标准库及其中包含的字符串和集合类 - 通过为您进行内存管理,可以使生活更轻松,更安全。
已编辑,如评论中所述。
答案 1 :(得分:3)
试试这个:
doSomething(unsigned char *buffer)
{
Socket.recv((char *)buffer);
printout(buffer);
}
编辑:是的,首先在调用doSomething之前为缓冲区分配一些内存。
编辑2:如果你想在doSomething中分配内存,那么:
doSomething(unsigned char **buffer)
{
*buffer = malloc( MAX_LENGTH_SOCKET_RECV_MAY_RETURN );
Socket.recv((char *)(*buffer));
printout(*buffer);
}
并且这样打电话:
doSomething( &buffer );
答案 2 :(得分:2)
我不知道你用于套接字的库是什么。但我认为首先你必须分配缓冲区来接收数据。只是声明接收数据,没有分配(甚至不是初始化)将导致未定义的行为。
猜猜。
答案 3 :(得分:2)
在C / C ++中,您无法将char*
分配给另一个来复制内存。您必须在receiveddata
上buffer
进行strncpy。
答案 4 :(得分:2)
参数通过值传递 - 调用者中的“缓冲区”在之前的调用之后仍然具有相同的值。函数中同名参数的更改不会影响它。
答案 5 :(得分:0)
我猜你需要在receiveddata上分配一些内存,而不仅仅是指针。
看起来Socket.recv(receiveddata)应该将接收到的数据复制到该指针,但指针指向无效的内存。 尝试:
receiveddata = malloc(10000);
在Socket.recv之前(receiveddata)
答案 6 :(得分:0)
您需要提供recv(
)将存储数据的有效缓冲区。
试试这个:
unsigned char buffer[512]
doSomething(buffer);
...
void doSomething(unsigned char* buffer)
{
Socket.recv(buffer);
printout(buffer)
}
答案 7 :(得分:-1)
可替换地:
#define MAX_RECV_OUTPUT_LENGTH 1024 // See comment below at recv() call.
char *buffer = new char[MAX_RECV_OUTPUT_LENGTH];
doSomething(buffer);
printout(buffer);
delete[] buffer;
void doSomething(char *buffer)
{
Socket.recv(buffer); // Ideally you would know how much memory you need (exactly or MAX, as specified by API).
}
所以: