C ++:简单传递char *?

时间:2009-08-05 12:06:46

标签: c++

我想简单地将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);
}

8 个答案:

答案 0 :(得分:5)

这里有两个问题:

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

  2. 您对buffer指针所做的更改不会传递到外部。如果你想这样做,你必须使用双指针。

  3. 以下是这两个问题的解决方案:

    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*分配给另一个来复制内存。您必须在receiveddatabuffer进行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).
}

所以:

  • 您需要自己分配,无论是使用new / delete还是malloc()/ free()(或通过容器变得明显)。
  • 将一个指针指向另一个指针只会改变指向的地址,它不会复制数据。
  • 如果是你正在处理的字符串,你需要未签名吗?只是检查..
  • 非常像其他人刚才说的:我们都假设recv()吃了一个指向写入的指针,但可能会有所不同?我们需要知道。