我需要从套接字中recv()数据并将其存储到缓冲区中,但我需要确保获取所有数据,这样我就可以在循环中进行操作了。因此,为了确保我的缓冲区没有空间,我正在尝试使用realloc来调整分配给缓冲区的内存。到目前为止,我有:
// receive response
int i = 0;
int amntRecvd = 0;
char *pageContentBuffer = (char*) malloc(4096 * sizeof(char));
while ((amntRecvd = recv(proxySocketFD, pageContentBuffer + i, 4096, 0)) > 0) {
i += amntRecvd;
realloc(pageContentBuffer, 4096 + sizeof(pageContentBuffer));
}
然而,由于Valgrind抱怨“valgrind:'不可能'发生了,所以这似乎没有正常工作:”。关于如何正确完成这项工作的任何建议?
谢谢, 赫里斯托斯
更新......我意识到我正在使用realloc错误。这是修订版:
int i = 0;
int amntRecvd = 0;
char *pageContentBuffer = (char*) malloc(4096 * sizeof(char));
while ((amntRecvd = recv(proxySocketFD, pageContentBuffer + i, 4096, 0)) > 0) {
i += amntRecvd;
char *temp = realloc(pageContentBuffer, 4096 + sizeof(pageContentBuffer));
if (temp != NULL) {
pageContentBuffer = temp;
}
}
然而,valgrind仍在抱怨:
==25812== Syscall param socketcall.recvfrom(buf) points to unaddressable byte(s)
==25812== at 0x33B880DAA1: recv (in /lib64/libpthread-2.5.so)
==25812== by 0x401D78: tunnelURL (proxy.c:371)
==25812== by 0x40142A: client_thread (proxy.c:194)
==25812== by 0x33B8806616: start_thread (in /lib64/libpthread-2.5.so)
==25812== by 0x33B7CD3C2C: clone (in /lib64/libc-2.5.so)
==25812== Address 0x5642768 is 0 bytes after a block of size 4,104 alloc'd
==25812== at 0x4A0590B: realloc (vg_replace_malloc.c:306)
==25812== by 0x401D47: tunnelURL (proxy.c:373)
==25812== by 0x40142A: client_thread (proxy.c:194)
==25812== by 0x33B8806616: start_thread (in /lib64/libpthread-2.5.so)
==25812== by 0x33B7CD3C2C: clone (in /lib64/libc-2.5.so)
答案 0 :(得分:3)
除了@whirlwind所说的,还有第二个问题:
sizeof
不返回先前分配的内存量,它实际上是一个编译时构造,相当于sizeof(char *)
,即字符指针的大小。
您需要在变量中手动跟踪缓冲区的长度。没有标准方法可以“询问”malloc / realloc分配了多少内存。
答案 1 :(得分:2)
也许是因为你滥用realloc()而存在问题。您需要查看它是否返回一个新指针,如果是,则存储该指针。
// receive response
int i = 0;
int amntRecvd = 0;
char *pageContentBuffer = (char*) malloc(4096 * sizeof(char));
while ((amntRecvd = recv(proxySocketFD, pageContentBuffer + i, 4096, 0)) > 0) {
i += amntRecvd;
pageContentBuffer = realloc(pageContentBuffer, 4096 + sizeof(pageContentBuffer));
}
答案 2 :(得分:1)
sizeof
是编译时值,而不是运行时。
realloc
可能会返回0。
试试这个......
// receive response
int i = 0;
int amntRecvd = 0;
int currentSize = 4096;
int oldSize = currentSize;
char *pageContentBuffer = (char*) malloc(currentSize);
while ((amntRecvd = recv(proxySocketFD, pageContentBuffer + i, 4096, 0)) > 0) {
i += amntRecvd;
oldSize = currentSize;
currentSize += 4096;
char *newBuffer = malloc(currentSize);
memcpy(newBuffer,pageContentBuffer,oldSize);
free(pageContentBuffer);
pageContentBuffer = newBuffer;
}
你最好的选择是重新分配,复制然后明确释放记忆 - realloc
很古怪。
答案 3 :(得分:1)
您的主要问题是您正在重新分配错误的内存量。你想要
realloc(pageContentBuffer, 4096 + i);
sizeof(pageContentBuffer)
只是sizeof(char *)
,这意味着您的重新分配远远少于第二次阅读时的需要。