class A
{
public:
A()
{
b = 0;
}
int b;
int a()
{
b++;
return 0;
}
};
void main()
{
int a;
A *test;
为什么这样的话,test = CCCCCCCC 呢?
在VC2008.NET的话就没有问题
求解
7 个解决方案
#1
野指针没分配内存
#2
你也没有初始化什么值都有可能
debug状态下会写0xCCCC
debug状态下会写0xCCCC
#3
对于临时变量的初始化,是跟编译器有关的。而在windows下VC编译器在Debug模式下为了调试方便(确定越界),会将未初始化的临时变量全部写成0xcc,下面是汇编代码,看红色那一句。
int _tmain(int argc, _TCHAR* argv[])
{
00251350 push ebp
00251351 mov ebp,esp
00251353 sub esp,0D8h
00251359 push ebx
0025135A push esi
0025135B push edi
0025135C lea edi,[ebp-0D8h]
00251362 mov ecx,36h
00251367 mov eax,0CCCCCCCCh
0025136C rep stos dword ptr es:[edi]
int a;
A *test;
return 0;
0025136E xor eax,eax
}
其实对于你的代码不光是test,就是那个a,也是这样的,因为默认显示是10进制,你可以在aotu或者local窗口找到a变量右键,Hexadecimal Display,可以看到a变量也是0CCCCCCCC。
而release下就不会添加初始化了
int _tmain(int argc, _TCHAR* argv[])
{
00251350 push ebp
00251351 mov ebp,esp
00251353 sub esp,0D8h
00251359 push ebx
0025135A push esi
0025135B push edi
0025135C lea edi,[ebp-0D8h]
00251362 mov ecx,36h
00251367 mov eax,0CCCCCCCCh
0025136C rep stos dword ptr es:[edi]
int a;
A *test;
return 0;
0025136E xor eax,eax
}
其实对于你的代码不光是test,就是那个a,也是这样的,因为默认显示是10进制,你可以在aotu或者local窗口找到a变量右键,Hexadecimal Display,可以看到a变量也是0CCCCCCCC。
而release下就不会添加初始化了
#4
没有初始化,什么值都是无意义的
#5
野指针,0xcccccccc在汇编中表示int 3,就是中断。
调试时候默认是这个值,如果把这个值当成代码执行,就直接中断
调试时候默认是这个值,如果把这个值当成代码执行,就直接中断
#6
我知道,但是为什么在VC++6.0中就有问题
VC2008.NET就没有问题呢
VS2008.NET就会创建一个指针并指向它,如果VC++6.0要做到同样的效果的话应该怎么做呢 ?
A test;
A *ptest;
ptest = &test;
难道要这样做?
VC2008.NET就没有问题呢
VS2008.NET就会创建一个指针并指向它,如果VC++6.0要做到同样的效果的话应该怎么做呢 ?
A test;
A *ptest;
ptest = &test;
难道要这样做?
#7
先new一个,如
A *ptest = new A;
#1
野指针没分配内存
#2
你也没有初始化什么值都有可能
debug状态下会写0xCCCC
debug状态下会写0xCCCC
#3
对于临时变量的初始化,是跟编译器有关的。而在windows下VC编译器在Debug模式下为了调试方便(确定越界),会将未初始化的临时变量全部写成0xcc,下面是汇编代码,看红色那一句。
int _tmain(int argc, _TCHAR* argv[])
{
00251350 push ebp
00251351 mov ebp,esp
00251353 sub esp,0D8h
00251359 push ebx
0025135A push esi
0025135B push edi
0025135C lea edi,[ebp-0D8h]
00251362 mov ecx,36h
00251367 mov eax,0CCCCCCCCh
0025136C rep stos dword ptr es:[edi]
int a;
A *test;
return 0;
0025136E xor eax,eax
}
其实对于你的代码不光是test,就是那个a,也是这样的,因为默认显示是10进制,你可以在aotu或者local窗口找到a变量右键,Hexadecimal Display,可以看到a变量也是0CCCCCCCC。
而release下就不会添加初始化了
int _tmain(int argc, _TCHAR* argv[])
{
00251350 push ebp
00251351 mov ebp,esp
00251353 sub esp,0D8h
00251359 push ebx
0025135A push esi
0025135B push edi
0025135C lea edi,[ebp-0D8h]
00251362 mov ecx,36h
00251367 mov eax,0CCCCCCCCh
0025136C rep stos dword ptr es:[edi]
int a;
A *test;
return 0;
0025136E xor eax,eax
}
其实对于你的代码不光是test,就是那个a,也是这样的,因为默认显示是10进制,你可以在aotu或者local窗口找到a变量右键,Hexadecimal Display,可以看到a变量也是0CCCCCCCC。
而release下就不会添加初始化了
#4
没有初始化,什么值都是无意义的
#5
野指针,0xcccccccc在汇编中表示int 3,就是中断。
调试时候默认是这个值,如果把这个值当成代码执行,就直接中断
调试时候默认是这个值,如果把这个值当成代码执行,就直接中断
#6
我知道,但是为什么在VC++6.0中就有问题
VC2008.NET就没有问题呢
VS2008.NET就会创建一个指针并指向它,如果VC++6.0要做到同样的效果的话应该怎么做呢 ?
A test;
A *ptest;
ptest = &test;
难道要这样做?
VC2008.NET就没有问题呢
VS2008.NET就会创建一个指针并指向它,如果VC++6.0要做到同样的效果的话应该怎么做呢 ?
A test;
A *ptest;
ptest = &test;
难道要这样做?
#7
先new一个,如
A *ptest = new A;