none
关于GUID的问题! RRS feed

  • 问题

  • 今天我模拟一个程序中的一个获得GUID的代码 模拟代码如下:
    #include<iostream>
    
    
    
    using namespace std;
    
    
    
    
    
    
    
    
    
    int main()
    
    {
    
        short a[1] ={20};
    
        int *result = (int *)&a[0];
    
        cout<<"a array is:"<<a[0]<<endl;;
    
        cout<<*result;
    
        
    
        return 0;
    
    }
    
    
    最后*result是4259860 我看了下这个数字的低二进制位刚好是20 把20改成15低二进制位刚好也是15 我想问下高位上的那些非0位是怎么来的? 我编译器VS2005  XP系统!
    2009年12月12日 2:01

答案

  • VC编译器为了检查内存非法访问,对未分配的内存设置成了cd
    short占两个字节。内存结构总是被设置成 15 00 cd cd。
    所以结果一样。
    麻烦把正确答案设为解答。
    • 已标记为答案 Beanbaby 2009年12月16日 6:44
    2009年12月15日 2:13
    版主
  • 你好!

    这可能是跟内存对齐有关,不足的部分都会用CC补齐。你可以在debug的时候打开Memory Windows查看。


    Please remember to mark the replies as answers if they help and unmark them if they provide no help.
    Welcome to the All-In-One Code Framework! If you have any feedback, please tell us.
    • 已标记为答案 Beanbaby 2009年12月16日 6:44
    2009年12月15日 8:21

全部回复

  • short只有2个字节,int占四个字节,你只给a分配了两个字节,高位上的两个字节是随机的,这就像你访问没有分配的内存空间一样的道理.


    0xBAADF00D
    2009年12月12日 5:35
    版主
  • short只有2个字节,int占四个字节,你只给a分配了两个字节,高位上的两个字节是随机的,这就像你访问没有分配的内存空间一样的道理.


    0xBAADF00D


    这个解释我也考虑了的 我这个是模拟一个游戏中关于获得游戏里每个物品的GUID 按照这个解释那就是那个游戏程序在运行的时候是依靠程序所处的不同运行时或在不同的内存位置能给出随机值咯 是不是这样的解释呢?
    于是我又模拟了如下代码:
    #include<iostream>

    using namespace std;

    class Object
    {
    public:
     Object(int val){a[0] =val;}
     int& GetGUID()
     {
       return *((int *)&a[0]);
     }
    private:
           short a[1];
    };


    class Item:public Object
    {
    public:
     Item(int val, int val2):Object(val),b(val2){}
    private:
     int b;
    };


    int main()
    {

     Item *aa = new Item(20, 10);

     int& result = aa->GetGUID();
     
     cout<<"The result is:" <<result <<endl;

     Item *bb = new Item(20, 10);

     int& result2 = bb->GetGUID();
     
     cout<<"The result is:" <<result2 <<endl;

     return 0;
    }

    上面的两个输出的都是3670036....输出还是一样的哦!!!!

    2009年12月12日 6:06
  • VC编译器为了检查内存非法访问,对未分配的内存设置成了cd
    short占两个字节。内存结构总是被设置成 15 00 cd cd。
    所以结果一样。
    麻烦把正确答案设为解答。
    • 已标记为答案 Beanbaby 2009年12月16日 6:44
    2009年12月15日 2:13
    版主
  • 你好!

    这可能是跟内存对齐有关,不足的部分都会用CC补齐。你可以在debug的时候打开Memory Windows查看。


    Please remember to mark the replies as answers if they help and unmark them if they provide no help.
    Welcome to the All-In-One Code Framework! If you have any feedback, please tell us.
    • 已标记为答案 Beanbaby 2009年12月16日 6:44
    2009年12月15日 8:21