提问人:Johnson_Doe 提问时间:8/9/2023 最后编辑:Johnson_Doe 更新时间:8/9/2023 访问量:42
为什么带有ERROR_NOT_ENOUGH_MEMORY错误代码的 strerror_s() 返回“Exec 格式错误”
Why is strerror_s() with ERROR_NOT_ENOUGH_MEMORY error code returning "Exec format error"
问:
给定以下示例 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和系统错误代码的文档,以尝试找出代码下面发生了什么。
我期待什么?我期望看到一条错误消息,内容为“没有足够的内存资源可用于处理此命令”。
答:
1赞
Some programmer dude
8/9/2023
#1
宏是特定于 Windows 的错误代码,通常由 GetLastError
() 返回,而 strerror
(和 strerror_s
)处理来自的标准 C 错误代码(在 Linux 或 macOS 等 POSIX 系统上也是获取错误代码的标准方法)。ERROR_NOT_ENOUGH_MEMORY
errno
若要获取 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);
评论
strerror
类似的函数需要从中获得的错误号,而不是 Windows 系统错误号。引用系统错误代码:“若要检索应用程序中错误的说明文本,请使用带有FORMAT_MESSAGE_FROM_SYSTEM
标志的FormatMessage
函数。errno