为什么以下两个代码段从指针的角度来看在C ++中给出不同的答案

时间:2018-10-16 12:08:32

标签: c++

为什么这两个代码对两个变量a和b的地址给出不同的答案?

代码1)

int *a, *b;
*a=1;
*b=2;
cout << *a << " in " << a << endl << *b << " in " << b << endl;
*b = *a;
cout << *a << " in " << a << endl << *b << " in " << b << endl;

代码2)

int a=1, b=2;
cout << a << " in " << &a << endl << b << " in " << &b <<endl;
b = a;
cout << a << " in " << &a << endl << b << " in " << &b <<endl;

谢谢。

1 个答案:

答案 0 :(得分:4)

int *a, *b;
*a=1;
*b=2;

在这里,您要创建两个新的指针而不初始化它们,然后写入它们指向的位置。这是未定义的行为,可能会使您的程序崩溃,甚至导致更坏的事情发生,例如导致可能难以调试的内存损坏。

相反,请尝试以下操作:

int *a = new int, *b = new int;

这将初始化堆上适当的内存量,并将地址分配给指针,从而可以安全地使用此类指针。

*b = *a;

在这里,您要将a指向的位置的值分配给b指向的位置的值。因此,这两个内存位置现在都应该存储1(假设未定义的行为尚未使程序崩溃)。

int a=1, b=2;
cout << a << " in " << &a << endl << b << " in " << &b <<endl;
b = a;
cout << a << " in " << &a << endl << b << " in " << &b <<endl;

这里您有两个整数。他们两个都有不同的地址,尽管它们通常相距不远(它们之间可能相差4左右)。值符合您的预期,a1b2,那么它们都是1

  

为什么这两个编码对两个变量的地址给出不同的答案   a和b

第一次是一个未初始化的值,通常是一个已经存在于内存中并且没有被清除的值。无论哪种方式,访问它都是未定义的行为。

第二次,这些值引用堆栈上的有效内存。这就是为什么打印的值如此不同的原因。