为什么带有 ERROR_NOT_ENOUGH_MEMORY 错误代码的 strerror_s() 返回“Exec format error”

问题描述 投票:0回答:1

给出以下示例 C 代码片段测试用例;

#include <stdio.h>
#include <windows.h>

#define SMALL_BUFFER 256

int main()
{

char* cErrorMessage = malloc(sizeof(char) * SMALL_BUFFER);

if (cErrorMessage == NULL)
{
    fprintf(stderr, "Insufficient memory available\n");  
    return 1;
}
else
{
    strerror_s(cErrorMessage, SMALL_BUFFER, ERROR_NOT_ENOUGH_MEMORY);                                             
    fprintf(stderr, "%s\n", cErrorMessage);                                                                         
}

free(cErrorMessage);

return 0;
}

为什么错误代码为 ERROR_NOT_ENOUGH_MEMORY 的 strerror_s() 会返回“Exec format error”消息?

我尝试了什么?我已通读 strerror_sSystem Error Codes 的文档,尝试找出代码下面发生的情况。

我在期待什么?我期望看到一条错误消息“没有足够的内存资源可用于处理此命令”。

c windows error-handling malloc strerror
1个回答
1
投票

ERROR_NOT_ENOUGH_MEMORY
是 Windows 特定的错误代码,通常由
GetLastError()
返回,而
strerror
(和
strerror_s
处理来自
errno
的标准 C 错误代码(以及在 POSIX 系统上)像 Linux 或 macOS 也是获取错误代码的标准方式)。

要获取 Windows 错误代码的描述,您需要使用

FormatMessage
:

char *cErrorMessage = NULL;
FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
               NULL,
               ERROR_NOT_ENOUGH_MEMORY,
               0,
               (LPCSTR) &cErrorMessage,
               0,
               0);
fprintf(stderr, "%s\n", cErrorMessage);
LocalFree((HLOCAL) cErrorMessage);
© www.soinside.com 2019 - 2024. All rights reserved.