我在visual studio 2010中创建了一个c ++ dll,其中有两个char *类型的变量(都没有初始化)。我已经使用不同的方法为这些变量分配了值。请参阅代码片段
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
);
以上代码在 WINDOWS 10 中失败。它适用于Windows 7,8。
当我初始化char * b像char* b =new char;
时,它开始在Windows 10上工作,虽然我只初始化了b和char * a仍未初始化。
当我将char * b初始化为NULL时,它不起作用。
Windows 10中是否存在内存分配问题?另外我想知道像这样初始化char *有什么缺点。
答案 0 :(得分:1)
GetClassName
需要"数组"写入的字符作为第二个参数。数组的长度作为第三个参数传递。
如果您将未初始化的指针作为第二个参数传递,那么您将有未定义的行为,因为指针将指向一个不确定的位置。即GetClassName
函数将写入内存中某些看似随机的位置。
调用它的最简单方法是声明一个数组并将其大小作为参数传递:
char b[256];
GetClassName(handle, b, sizeof b);
至于为什么它似乎有时而不是其他时间,它只是因为未定义的行为。其中一种可能性是看似正在工作。
当您执行b = new char
时,您只会分配单个字符。它只能保存一个大小为零的以null结尾的字节字符串,因为它可以包含的是终结符。将1
以外的任何大小传递给GetClassName
将导致函数写出超出已分配内存的范围,并且您将再次具有未定义的行为。
此外,a
已初始化。它由先前分配的strtok
调用结果初始化。这并不重要,因为在a
的调用中未使用GetClassName
。其初始化状态与GetClassName
呼叫无关。