【问题标题】:Initializing pointer to a pointer that's dynamically allocated in function将指针初始化为在函数中动态分配的指针
【发布时间】:2013-01-31 22:41:39
【问题描述】:

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

感谢您的帮助!

【问题讨论】:

  • 在函数末尾添加*response [recv_total] = '\0';否则缓冲区不会被 NUL 终止。 2)另外:tmpres 可以是-1;应单独处理。
  • 什么是缓冲区? readbuf ??

标签: c pointers realloc


【解决方案1】:

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

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

2) Q:在main函数中释放是否正确?

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

3) Q: 对第一个请求进行查找,第二个请求通常会导致 seg 错误。

我的猜测是您代码中某处的指针。

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

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

请发回你找到的东西!

【讨论】:

  • 忘记将缓冲区放入代码 sn-p,它现在在那里。我相信 seg 错误是缓冲区溢出的结果,但我不知道它为什么会发生。我正在处理一些包含 char[] 的结构。这些作为指针传递给其他函数,然后被存储在我的响应变量中的内容破坏。
  • 您的编辑只是混淆了一些事情:您现在在 main() 中分配 readbuf[],将其传递给 handle_request_data(),创建一个 NEW 缓冲区,并忽略第一个readbuf[] 完全一致。但最重要的是:SURE 你没有覆盖“recv()”中的缓冲区,或者覆盖“memcpy()”中的“response()”。强烈建议使用调试器。恕我直言...
【解决方案2】:

首先,简单的:

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

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • @enpo。好的。现在你在handle_request_data 中定义了缓冲区。它现在正在工作吗?这是问题吗?还是只有第一个问题?并且可以去掉函数的第一个参数和readbuf的main中的定义。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-07
    • 1970-01-01
    • 2010-10-11
    • 2014-09-10
    • 1970-01-01
    相关资源
    最近更新 更多