使用变量初始化缓冲区数组的长度

时间:2013-03-10 16:16:33

标签: c++ c

我正在从套接字读取缓冲区字节,但我不知道如何用长度信息初始化缓冲区数组。

uint32_t len;
int lengthbytes = 0;
int databytes = 0;

// receive the length info of an image data
lengthbytes = recv(clientSocket, (char *)&len, sizeof(len), 0);

// convert hexadecimal data to length in bytes
len = ntohl(len);

// ????? how to initialize the buffer array with the length info ????
char buf[len];   -----> this is illegal in C  

// read the image data 
databytes = recv(clientSocket, buf, sizeof(buf), 0);

7 个答案:

答案 0 :(得分:4)

len = ntohl(len);
char buf[len];  //----> this is illegal in C  

这在C99中有效,它被称为可变长度数组。如果您不使用C99,请使用malloc分配数组(并将buf声明为char *)。

答案 1 :(得分:2)

声明buf时声明可变长度数组。这在C中是合法的(来自C99标准),但在C ++中是非法的。在C ++中,您可以使用std::vector

std::vector<char> buf(len);

您也可以在调用recv时使用此向量:

databytes = recv(clientSocket, &buf[0], buf.size(), 0);

要在循环内使用向量,您有两种选择:

  1. 在循环外声明变量,并在需要时使用clearresize

    std::vector<char> buf;
    
    // ...
    
    for (int i = 0; i < number_of_images; i++)
    {
        std::cout << "Fetching image #" << (i + 1) << '\n';
    
        // Get the image length
        size_t length = get_image_length();
    
        buf.clear();  // Clear the buffer
        buf.resize(length);  // Set the size to the image length
    
        // Receive the image
        databytes = recv(clientSocket, &buf[0], buf.size(), 0);
    }
    
  2. 声明向量在循环中是本地的:

    for (int i = 0; i < number_of_images; i++)
    {
        std::cout << "Fetching image #" << (i + 1) << '\n';
    
        // Get the image length
        size_t length = get_image_length();
    
        std::vector<char> buf(length);
    
        // Receive the image
        databytes = recv(clientSocket, &buf[0], buf.size(), 0);
    }
    

答案 2 :(得分:1)

您必须使用动态内存分配;

char* buf = new char[len];

如果您已完成buf,请不要忘记致电delete以释放内存。

delete[] buf;

答案 3 :(得分:1)

请通过malloc分配缓冲区,即buf = malloc(sizeof(char) * len);

答案 4 :(得分:1)

你可以用new或malloc来做。 完成后别忘了删除缓冲区!

答案 5 :(得分:1)

您可以使用std::vector<char>,然后使用data()作为数组缓冲区:

#include <vector>
std::vector<char> buf(len);
databytes = recv(clientSocket, buf.data(), buf.size(), 0); // access underlying char array
databytes = recv(clientSocket, &buf[0], buf.size(), 0);    // as above, C++03 version

答案 6 :(得分:1)

我在C ++中为此目的编写了一个名为tempbuf的类。

你可以在这里找到它:
small_lib.cpp
small_lib.h

这两个文件是MIT许可的,所以你可以随意使用它。

如何使用这个课程?

tempbuf buf(len);
databytes = recv(clientSocket, buf.get(), buf.size(), 0); // if you want char* returned
databytes = recv(clientSocket, buf.constchar(), buf.size(), 0); // if you want constchar* returned

猜猜为什么我写这个课?您不需要删除或取消分配动态分配的内存,因为它是在类的析构函数中完成的。

为什么我不使用std::auto_ptr?因为根据我的理解,这仅适用于非数组,因为它支持new X但不支持new X[10]