none
哪位高人能帮我解释一下这段代码 RRS feed

  • 问题

  • 不知哪位有心高人能帮我解释一下下面这段代码? 感激不尽。

    struct foo { int i; char c; }
    bar (struct foo *a) {
    	if (a->c == 0) {
    	   *((char *)a + sizeof(int)) = 1;
    	   if (a->c != 0)
    	   abort();
    	}
    }
    2009年10月11日 11:01

答案

  • 判断成员变量c是否为0,如果是则将c赋值为1,再判断c是否不为0,如果是退出程序。


    麻烦把正确答案设为解答。
    • 已标记为答案 华炯宇 2009年10月14日 9:11
    2009年10月13日 5:27
    版主

全部回复

  • 判断成员变量c是否为0,如果是则将c赋值为1,再判断c是否不为0,如果是退出程序。


    麻烦把正确答案设为解答。
    • 已标记为答案 华炯宇 2009年10月14日 9:11
    2009年10月13日 5:27
    版主
  • 谢谢
    能不能详解一下
    *((char *)a + sizeof(int)) = 1;

     这句?

     

    2009年10月14日 9:12
  • 首先把结构体a转成char*,然后加上int类型大小的偏移量4个字节。
    由于foo 结构体的成员变量首先是int然后是一个char。并且别有虚函数和虚基类,所以偏移4个字节后,指针正好指向第二个成员变量char c。然后再对该指针dereferenece。进行赋值。


    麻烦把正确答案设为解答。
    2009年10月15日 0:39
    版主
  • 不知哪位有心高人能帮我解释一下下面这段代码? 感激不尽。

    struct foo { int i; char c; }
    
    bar (struct foo *a)
    { if (a->c == 0)
    { *((char *)a + sizeof(int)) = 1; if (a->c != 0) abort(); } }



    你这个程序有错误struct foo { int i; char c; } 这里是定义了一个结构foo但最后少了一个分号故此处有一个错误
    下面的那部分你似乎定义了一个涵数,但却有不完整
    if (a->c == 0)
    {

       *((char *)a + sizeof(int)) = 1;  
       if (a->c != 0)

       abort();

    }
    这里就是如果变量a的成员c如果等于0就把a这个结构指针强制转换成char*
     sizeof(int)) 这个测出int类型在你的系统中占的字节数
    最后把a的向后移int个字节(有的占2个字节 有的占4个字节)在把1放在这个地址处。这个值你只能通过指针a操作
    后面的   if (a->c != 0)
    和前面的类似

    冰冻三尺非一日之寒,为了共同的梦想...........努力........在努力.......成功
    2009年10月17日 7:30