2

当我试图存储从套接字接收的数据时,我正在将一个指针传递给一个函数以动态分配它。它适用于一个请求,第二个请求通常会导致段错误。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;
    }
}

谢谢您的帮助!

4

3 回答 3

1

1) Q: 初始化指向在函数中动态分配的指针的指针

警告:您应该只在函数内部初始化一次指针。如果您在其他地方(重新)初始化它,您将面临内存泄漏或其他灾难的风险。

2)问:在main函数中free它是否正确?

当然 :)。但同样的警告:只释放一次。而且,理想情况下,在释放它之后养成将它设置为 NULL 的习惯。

3) 问:它对第一个请求有效,第二个请求通常会导致 seg 错误。

我的猜测是您在代码中的某处踩到了指针。

问:“缓冲区”在哪里定义?你确定你没有在 recv() 中覆盖它(并破坏你的“响应”指针)吗?

问:段错误究竟发生在哪里?你能在调试器中单步调试那部分代码吗?

请发回你找到的东西!

于 2013-01-31T23:03:28.483 回答
0

首先,最简单的:

在主函数中释放它是否正确?

为什么不呢?反正你什么也做不了。

其次,困难的部分:好吧,您应该尝试使用调试器调试您的代码。乍一看,这似乎很好,但我们永远不知道。你在使用多线程吗?您确定不存在竞争条件吗?等等。

于 2013-01-31T22:49:59.687 回答
0

什么是缓冲区?内部handle_request_data未定义。全球?你的意思是 readbuf 吗?不使用该参数。

于 2013-01-31T22:58:48.220 回答