我正在向指向函数的指针传递指针,以便在我尝试存储从套接字接收的数据时动态分配它。它可以找到一个请求,第二个通常会导致seg错误。 Valgrind抱怨:条件跳转或移动取决于指向我的响应指针的未初始化值。
如何初始化指针或我该怎么做以确保安全?在主函数中释放它是否正确?
int main(int argc, char **argv) {
char * response;
char readbuf[BUFFSIZE + 1] = "";
//here I read some data into readbuff which I will send to the server below
handle_request_data(readbuf, &response);
//do some stuff with response, send to another socket
free(response); // can I do that?
}
int handle_request_data(char * readbuf, char ** response) {
//create tcp socket, connect to it and send readbuf to server
int recv_total = 0;
char buffer[BUFFSIZE + 1] = "";
*response = malloc(BUFFSIZE + 1);
while ((tmpres = recv(sock_tcp, buffer, BUFFSIZE, 0)) > 0) {
if (recv_total > 0) {
//need more memory for buffer
*response = realloc(*response, BUFFSIZE + recv_total + 1);
}
memcpy(*response + recv_total, buffer, tmpres);
recv_total += tmpres;
}
}
感谢您的帮助!
答案 0 :(得分:1)
1)问:初始化指向在函数
中动态分配的指针警告:你应该只在函数内部初始化一次指针。如果您(重新)在其他地方初始化它,则存在内存泄漏或其他灾难的风险。
2)问:在主函数中释放它是否正确?
当然:)。但同样需要注意的是:只将释放一次。并且,理想情况下,养成在释放它之后将其设置为NULL的习惯。
3)问:它可以找到一个请求,第二个通常会导致seg错误。
我的猜测是你在代码中的某个地方踩着。
问:“缓冲区”定义在哪里?你确定你没有在recv()中覆盖它(以及破坏你的“响应”指针)吗?
问:问题究竟发生在哪里?你可以在调试器中单步调试那部分代码吗?请回复你找到的内容!
答案 1 :(得分:0)
首先,简单的一个:
在主函数中释放它是否正确?
为什么不呢?无论如何你什么也做不了。
其次,困难的部分:您应该尝试使用调试器调试代码。乍一看,它似乎很好,但我们永远不会知道。你在使用多线程吗?你确定没有竞争条件吗?等
答案 2 :(得分:0)
什么是缓冲? handle_request_data
内部未定义。全球?
你的意思是readbuf ??不使用此参数。