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

Why is strerror_s() with ERROR_NOT_ENOUGH_MEMORY error code returning "Exec format error"

提问人:Johnson_Doe 提问时间:8/9/2023 最后编辑:Johnson_Doe 更新时间:8/9/2023 访问量:42

问:

给定以下示例 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;
}

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

我试过了什么?我已经通读了strerror_s系统错误代码的文档,以尝试找出代码下面发生了什么。

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

C Windows 错误处理 malloc strerror

评论

0赞 stark 8/9/2023
请参阅 ENOEXEC learn.microsoft.com/en-us/cpp/c-runtime-library/...
0赞 Bodo 8/9/2023
strerror类似的函数需要从中获得的错误号,而不是 Windows 系统错误号。引用系统错误代码:“若要检索应用程序中错误的说明文本,请使用带有 FORMAT_MESSAGE_FROM_SYSTEM 标志的 FormatMessage 函数。errno

答:

1赞 Some programmer dude 8/9/2023 #1

宏是特定于 Windows 的错误代码,通常由 GetLastError() 返回,而 strerror(和 strerror_s处理来自的标准 C 错误代码(在 Linux 或 macOS 等 POSIX 系统上也是获取错误代码的标准方法)。ERROR_NOT_ENOUGH_MEMORYerrno

若要获取 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);