windows 10 中 char* 的内存分配问题

memory allocation issue of char* in windows 10

我在 visual studio 2010 年创建了一个 c++ dll,其中有两个类型为 char* 的变量(均未初始化)。我使用不同的 methods.Please 为它们赋值,请参阅片段

char* a;
char* b;
a = strtok(input,"^");
GetClassName(handle,b,255);
...
//definition of GetClassName
WINUSERAPI
int
WINAPI
GetClassName(
__in HWND hWnd,
__out_ecount_part(nMaxCount, return) LPSTR lpClassName,
__in int nMaxCount
);

上述代码在 WINDOWS10 中失败。它适用于 windows 7,8.

当我像 char* b =new char; 一样初始化 char* b 时,它开始在 windows 10 上工作,尽管我只初始化了 b 而 char* a 仍未初始化。 当我将 char* b 初始化为 NULL 时,它不起作用。

windows10 中是否存在任何内存分配问题?我也想知道像这样初始化 char* 有什么缺点吗?

GetClassName 期望 "array" 字符作为第二个参数写入。数组的长度作为第三个参数传递。

如果您传递一个未初始化的指针作为第二个参数,那么您将有未定义的行为,因为指针将指向一个不确定的位置。 IE。 GetClassName 函数将写入内存中一些看似随机的位置。

调用它的最简单方法是声明一个数组并将其及其大小作为参数传递:

char b[256];
GetClassName(handle, b, sizeof b);

至于为什么它似乎有时有效而其他时候无效,这只是因为 未定义的行为。一种可能性是看似有效。

而当您执行 b = new char 时,您只会分配一个 单个字符 。它只能容纳大小为零的以空字符结尾的字节字符串,因为它只能包含终止符。将 1 以外的任何内容作为大小传递给 GetClassName 将导致函数写入超出分配的内存范围,并且您将再次出现 未定义的行为


此外,a已初始化。它由 strtok 调用结果的先前分配初始化。这无关紧要,因为 a 未在对 GetClassName 的调用中使用。它的状态是否已初始化与 GetClassName 调用无关。