首先要明确一个概念:
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,所以此时程序就默认以前是只创建了一个进程,一次类推,程序不断的默认只创建一个进程,永远不会被限制条件所限制停止程序,最终耗光所有的系统资源,造成死机