初始化指向在函数中动态分配的指针

时间:2013-01-31 22:41:39

标签: c pointers realloc

我正在向指向函数的指针传递指针,以便在我尝试存储从套接字接收的数据时动态分配它。它可以找到一个请求,第二个通常会导致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;
    }
}

感谢您的帮助!

3 个答案:

答案 0 :(得分:1)

1)问:初始化指向在函数

中动态分配的指针

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

2)问:在主函数中释放它是否正确?

当然:)。但同样需要注意的是:只将释放一次。并且,理想情况下,养成在释放它之后将其设置为NULL的习惯。

3)问:它可以找到一个请求,第二个通常会导致seg错误。

我的猜测是你在代码中的某个地方踩着

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

问:问题究竟发生在哪里?你可以在调试器中单步调试那部分代码吗?

请回复你找到的内容!

答案 1 :(得分:0)

首先,简单的一个:

  

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

为什么不呢?无论如何你什么也做不了。

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

答案 2 :(得分:0)

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