我正在将指向指针的指针传递给函数以动态分配它,因为我正在尝试存储从套接字接收的数据。它可以找到一个请求,第二个请求通常会导致段错误。 Valgrind 提示:条件跳转或移动取决于引用我的响应指针的未初始化值。
我怎样才能初始化指针或者我能做些什么来保证它的安全?在 main 函数中释放它是否正确?
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;
}
}
感谢您的帮助!
最佳答案
1) 问:将指针初始化为在函数中动态分配的指针
警告:您应该只在函数内部初始化一次指针。如果您在别处(重新)初始化它,您将面临内存泄漏或其他灾难的风险。
2)问:在main函数中释放是否正确?
当然 :)。但同样的警告:只释放它一次。并且,理想情况下,养成在释放它后将其设置为 NULL 的习惯。
3) 问:它对一个请求有效,第二个请求通常会导致段错误。
我的猜测是您踩了代码中某处的指针。
问:“buffer”是在哪里定义的?您确定您没有在 recv() 中覆盖它(并破坏您的“响应”指针)吗?
问:段错误到底发生在哪里?你能在调试器中单步调试这部分代码吗?
请发回您找到的内容!
关于c - 初始化指向在函数中动态分配的指针的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14636489/