【问题标题】:Freeing a character pointer returns error释放字符指针返回错误
【发布时间】:2012-11-17 22:54:11
【问题描述】:

我试图在使用后释放一个字符指针,但它返回一个奇怪的错误。

错误提示:

_CrtDbgREport:字符串太长或 IO 错误

调试器本身在编译时不返回错误。

目前的代码如下所示:

void RespondToUser(SOCKET client, SOCKET server)
{
    char buffer[80];
    char *temp = malloc(_scprintf("HTTP/1.1 200 OK\r\n%s\r\nServer: %s\r\nConnection: close\r\n\r\nHi!", buffer, SERVER_NAME));
    sprintf(temp, "HTTP/1.1 200 OK\r\n%s\r\nServer: %s\r\nConnection: close\r\n\r\nHi!", buffer, SERVER_NAME);

    send(client, temp, strlen(temp), 0);
    closesocket(client);
    free(temp);
    ListenToUsers(server);
}

仅当我尝试从内存中释放临时指针时才会出现此问题,否则不会出现此问题。这可能是什么原因造成的?

【问题讨论】:

  • 除了 hmjd 写的内容之外,您正在阅读未初始化的 buffer

标签: c pointers memory-management malloc


【解决方案1】:

sprintf() 的调用是在末尾写一个(因为它附加了一个NULL 终止符),因为_scprintf() 的返回值不包括NULL 终止符。来自_scprintf()参考页:

返回如果要使用指定的格式代码打印字符串或将其发送到文件或缓冲区时将生成的字符数。 返回的值不包含终止空字符。

这意味着程序具有未定义的行为。将+ 1 更正为_scprintf()s 返回值。

【讨论】:

    猜你喜欢
    • 2011-01-11
    • 1970-01-01
    • 2021-11-04
    • 1970-01-01
    • 2022-01-07
    • 2013-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多