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

标签 c pointers realloc

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

相关文章:

c - 动态结构数组中的元素数

c - C 中的优化矩阵乘法

c - 如何在C中访问指针到指针的值?

c - 我的循环链表代码有什么问题?

c - 为什么在克隆系统调用后重新分配死锁?

c - C中的内存泄漏,结构中的二维数组

c++ - Clion 的调试器正在运行程序,但常规控制台却没有。

c - Linux内核中是否有函数/宏来获取smp机器上的当前抢占状态?

c - 用于从现有文件创建 (.so) 文件的 makefile

json - 基于对象何时转换为指针(有时是指针,有时是映射)更改解码功能