为什么这两个代码对两个变量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;
谢谢。
答案 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左右)。值符合您的预期,a
是1
,b
是2
,那么它们都是1
。
为什么这两个编码对两个变量的地址给出不同的答案 a和b
第一次是一个未初始化的值,通常是一个已经存在于内存中并且没有被清除的值。无论哪种方式,访问它都是未定义的行为。
第二次,这些值引用堆栈上的有效内存。这就是为什么打印的值如此不同的原因。