0 c++
我想简单地将一个char作为参数传递给一个函数,然后该函数应该对其进行修改.不幸的是,当在下面这样做时,缓冲区的打印输出不相等.我不明白,因为我传递一个指向char数组的指针.有人看到了遗漏的明显事物吗?
unsigned char* buffer;
doSomething(buffer)
printout(buffer);
Run Code Online (Sandbox Code Playgroud)
其中doSomething()定义为:
doSomething(unsigned char *buffer)
{
char* receiveddata;
Socket.recv(receiveddata);
buffer = ( unsigned char* ) receiveddata;
printout(buffer);
}
Run Code Online (Sandbox Code Playgroud)
你有两个问题:
指针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);
}
Run Code Online (Sandbox Code Playgroud)
请注意,此代码容易受到缓冲区溢出攻击,以防有人发送比预期更多的数据.你使用什么套接字库?它是否有一种机制可以保护您不会向缓冲区写入更多数据(例如,recv指定缓冲区长度的附加参数)?
你会这样称呼如下:
unsigned char* buffer;
doSomething(&buffer);
// Process the data in buffer, then free it when you're done:
delete [] buffer;
Run Code Online (Sandbox Code Playgroud)
但是,正如其他人所指出的那样,自己管理内存分配和删除是很麻烦的.看一下标准库及其中包含的字符串和集合类 - 通过为您进行内存管理,可以使生活更轻松,更安全.
编辑如评论中所述.