首先要明确一个概念:
1、初始化:C++中变量的初始化是如下形式:
int a = 0;
也就是说在创建变量的时候,在内存中为这个变量开辟一段内存,同时把这个数值填进去。如果只是定义变量
int a;
那么此时虽然 创建了a变量,为a变量开辟了一个内存空间,但是此时这段内存空间里面的值没有被指定,是随机的,也就是垃圾值
2、赋值
赋值是在定义了变量之后,利用其他内存块中的数值来覆盖当前变量的所在的内存。
初始化只能进行一次,即在变量定义的时候,但是赋值却可以进行多次。
在实验2-1的时候,可能大家没有发现,所谓的创建进程就是以你自己写出代码的那个进程为父进程,进而运行这个程序创建一些子进程,并且程序做了明确的限制,只创建5个进程就停止这个程序。
int main(int argc, char *argv[]) { int nClone; //nClone = 0; NO1 if(argc > 1) { ::sscanf(argv[1], "%d", &nClone); } nClone = 0; NO2 cout << "Process ID:" << ::GetCurrentProcessId() <<",Clone ID:" << nClone <<endl; const int c_nCloneMax = 5; if(nClone < c_nCloneMax) { StartClone(++nClone); } getchar(); return 0; }
这是我们这次实验的主函数,当我们运行这个程序的时候,第一次执行的就是父进程,因为我们在运行程序的时候没有为main函数提供多余的参数,所以此时argc参数个数是等于1,所以此时不执行if那个语句。改了 第二次的样子应该像上面一样,先是定义这个NCLONE变量,此时这个变量里面就是垃圾值,因为没有初始化,该变量所在的内存里面的值不确定,是随机的,因为跳过了IF语句执行了nCloneDE = 0,这个赋值语句,所以当前执行的这个父进程没有问题。但是在父进程创建第一个子进程的时候,nClone因为是做进程个数的计数器,此时已经变为1,创建子进程的时候,再调用Main函数就会执行主函数里面的if语句,因为要把当前创建子进程的个数传递进去,因为只有这样,随着创建进程个数的增加,整个程序才会停止,但是因为第二次修改在if语句后面把本来已经获取到值得nClone给覆盖了,再次改成0,所以此时程序就默认以前是只创建了一个进程,一次类推,程序不断的默认只创建一个进程,永远不会被限制条件所限制停止程序,最终耗光所有的系统资源,造成死机