C++结构体初始化导致程序不正常?

代码如下:

#include <Windows.h>
#include <stdlib.h>
#include <stdio.h>
#include <TlHelp32.h>

int main()
{
HANDLE h=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);

PROCESSENTRY32 ppe={0}; //就是这里,如果没有初始化,就可以正常运行,否则程序不输出内容。这是为什么?
Process32First(h,&ppe);

do
{
printf("Process Name %s\n",ppe.szExeFile);
} while(Process32Next(h,&ppe));

system("pause");

return 0;
}

因为很多 Win32API 用到的结构体有一个 cb / cbSize / dwSize 之类的成员,用于说明这个结构体的大小。

在调用 API 之前,需要把结构体的大小赋值给这个成员,API 可以借此判断结构体的版本更新。

PROCESSENTRY32 这个结构体的第一个成员就是 dwSize, PROCESSENTRY32 ppe={0} 这个初始化方式会把 dwSize 赋值为 0,API 就无法判断结构体的版本,而认为输入的参数无效,自然就不会有任何结果了。

一般来说,标准的 Win32API 结构体初始化方法是:

PROCESSENTRY32 ppe;
ZeroMemory(&ppe, sizeof(ppe)); // memset(&ppe, 0, sizeof(ppe));
ppe.dwSize = sizeof(ppe);
温馨提示:内容为网友见解,仅供参考
无其他回答

C++结构体初始化导致程序不正常?
PROCESSENTRY32 这个结构体的第一个成员就是 dwSize, PROCESSENTRY32 ppe={0} 这个初始化方式会把 dwSize 赋值为 0,API 就无法判断结构体的版本,而认为输入的参数无效,自然就不会有任何结果了。一般来说,标准的 Win32API 结构体初始化方法是:PROCESSENTRY32 ppe;ZeroMemory(&ppe, sizeof(ppe)...

在C++中对结构体进行定义后,为什么初始化结构体时总是出错?程序...
是string 惹的祸,此时的name并不能指定长度,无法确定初始化大小,也就不能直接这样子赋值了。改成 struct Student stu;stu.num=97001;stu.name="Lin Lin";stu.sex='F';stu.age=10;就可以执行成功。

在MFC(C++)中定义了一个全局结构体,在其他函数中用这个结构体,编译调 ...
当然切记需要将course.h包含进来。希望能帮到你...

C++中结构体数组的初始化问题
第一个问题,不能这样初始化,需要 inflatable a={0};集合中至少需要1个元素方可作为初始化列表,专业会将name、volume、price的所有字节全部初始化为0。第二个问题,如果结构体包含有string a;那么就不能使用初始化列表初始化了。也就是说 inflatable a={0}会编译不成功,因为string类有构造函数,具...

C++内存故障解决小记(#pragma pack 对c++工程的影响)
在多线程网络编程中,使用c++与qt构建,每个线程负责一个socket。对于需要直接进行tcp通信的socket,序列化采用结构体直接拷贝方式;对于使用mqtt通信的socket,序列化工具为protobuf。在开发过程中,我们遇到了两个内存异常问题。首先遇到的是内存异常问题,使用strace工具检查发现,问题出在某一特定线程的代码...

dev c++一运行就停止工作求助啊崩溃
1、主函数内部初始化的数组过大,如:int num[100000000]; 会崩溃,要写int *num = new int[100000000];2、结构体指针为空,但调用了其成员,如:NODE* node; node->next...应先分配空间 NODE* node = new NODE;3、无法跳出的递归,递归次数过多,Dev cpp不会显示stack overflow而会直接崩溃...

定义一个结构体数组,可以在初始化里直接赋值吗?比如 struct a{ int d...
struct a{ int d=0; \/\/这样写是错误的,在运行时会出现程序异常 }b[10];结构体定义是进行一种数据描述,不具备实例化的情况。只有在有具体的数据变量(实例,在C++k中也称对象)时,才可以对数据进行初始化。正确的写法为:struct a{ int d;}b[10]={0}; \/\/对具体的变量b数组进地元素初始...

C++里面能不能直接给结构体赋值?
TC确实不允许这样的初始化, TC++里面编译这样的C代码也不行,看来Borland的开发者们还是忠于的早期的C风格。LCC看来也不支持。早期的C以及ANSI C中是不允许对结构体型的自动变量进行一次性初始化的,要进行一次性初始化,除非你把你需要的struct变量声明为静态(static)变量,或全局变量(全局变量被默认...

c++结构体成员初始化
用一位二进位即可。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进位划分为几个不同的区域,并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。这样就可以把几个不同的对象用一个字节的二进制位域来...

C语言中,使用一个结构体之前,要用memset把各个位清零???
这是在对结构体进行初始化,下面是对memset的详细解释:原型: void *memset(void *s,int ch,size_t n);头文件:#include<string.h> 作用:将s所指向的某一块内存中的每个字节的内容全部设置为ch指定的ASCII值, 块的大小由第三个参数指定,该函数通常为新申请的内存做初始化工作, 其返回值为...

相似回答