C++:简单传递char*?

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)

Mar*_*n B 5

你有两个问题:

  1. 指针receiveddata未初始化,因此指向内存中的某个随机位置.这将导致您在某处丢弃数据.

  2. 您对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)

但是,正如其他人所指出的那样,自己管理内存分配和删除是很麻烦的.看一下标准库及其中包含的字符串和集合类 - 通过为您进行内存管理,可以使生活更轻松,更安全.

编辑如评论中所述.

  • Urgh.现在该函数传递出内存,它分配给其他人删除.使用`malloc`而不是`new`有什么意义?毕竟,问句被标记为"C++".如果其他人试图"删除"那段记忆,你认为会发生什么?你怎么知道256字节就足够了?(无论如何,`Socket.recv()`thingie是什么?) (2认同)