附加到动态分配的数组

时间:2011-10-25 12:51:01

标签: c

我正在尝试将接收到的数据添加到需要在运行时配置的缓冲区(我从文件或命令行读取大小)。

所以基本上我确定我的buffersize并使用calloc分配一个内存区域(如果它不在配置文件或命令行中,我还设置了一个缓冲区 - 让我们假设我们暂时使用它。)

我只提供适用的代码行。

int buffersize=10000;
void *BuffPtr = (void *)calloc(1,buffersize * sizeof(char));

然后我从UDP获得recv(我尝试接收到char数组并动态分配数组 - 两者都工作正常)

// Setup socket......

void *PktBuff = (void *)calloc(1,1000 * sizeof(char));

// Loop and receive many packets......

rcvd_bytes=recv(recv_socket, PktBuff, 1000, 0);

此时,我可以编写PktBuff的内容,它可以正常工作。但是我希望在动态分配的数组(上面定义的BuffPtr)中连接多个收到的数据包。

我已经尝试过strcat,但是如果我尝试写入收到的第一个数据包而没有获得另一个数据包,我就会把垃圾拿出来。

strcat(BuffPtr, PktBuff);

我做错了什么?

提前致谢。

3 个答案:

答案 0 :(得分:3)

您的数据似乎不是以0结尾的字符串,您可能希望改为使用memmove

答案 1 :(得分:2)

几点和观察:

  1. 请勿在C中投射malloc()的返回值。
  2. 表达式sizeof (char)是一种写作1的冗长方式,乘以它很少提供信息。
  3. 确保所有数据都以0结尾(字符串),否则您无法使用字符串函数,因为这是他们所需要的。
  4. 您可能只需使用额外的size_t计数器来跟踪BuffPtr中的字节数,并使用它并memcpy()追加。

答案 2 :(得分:0)

好的,代码strcat中的一些问题不是追加二进制数据的正确方法。这是一个半稳健的实现。我没有检查它的语法错误,只是输入它,请将其作为示例进行研究,并将其调整为您的代码。

/* total number of bytes you are willing to receive in single a single receive */ 
#define MAX_RECV_BUFFER 1000

/* total number of bytes you are willing to store in memory */
#define MAXBYTES MAX_RECV_BUFFER*1000

int append_bytes() {
    char rcvbuf[MAX_RECV_BUFFER]; /* buffer where things are received */
    void *buf = NULL; /* buffer where bytes are collected */
    size_t rcvlen; /* length of data received */
    size_t buflen = 0; /* total bytes */

    while(1) {
         void *p;
         rcvlen = recv(recv_socket, rcvbuf, MAX_RECV_BUFFER, 0);
         if ( rcvlen < 0 ) { manage_error(); }
         if ( rcvlen == 0 ) 
                 break;
         if ( buflen + rcvlen > MAXBYTES) 
                 break;
         p = realloc(buf, buflen+recvlen);
         if ( !p ) { manage_memory_error(); }
         buf = p; /* we have enough space */
         memcpy(buf+buflen, rcvbuf, recvlen); /* append new content to end of buffer */
         buflen+=recvlen; /* add length to buflen */
    }      
}