1、下面的程序运行时哪一行会出现错误:struct S
{
    int i;
    int * p;
};
int main()
{
    S s;
    int * p = &s.i;
    p[0] = 4;
    p[1] = 3;
    s.p = p;
    s.p[1] = 1;
    s.p[0] = 2;
    return 0;
}

解决方案 »

  1.   

    int *p = &s.i;
    蒙的 :)
      

  2.   

    s.p[1] = 1;//此时p的内容是ox00000001
    s.p[0] = 2;//等于把内存0x00000001赋值2,这里错
      

  3.   

    我的vc6说的,他说他可以编译,还演示给我看了int *p = &s.i;
    初始化p,再正常不过了
      

  4.   

    " p[0] = 4;"    ->  p[]没有声明啊???????????
      

  5.   

    p[1]的用法错了,p只有一个空间,p[0]指的就是s.i,p[1]引用非法。
      

  6.   

    struct S
    {
        int i;
        int * p;
    };
    int main()
    {
        S s;
        int * p = &s.i;
        p[0] = 4;            //==> s.i = 4;
        p[1] = 3;            //p[1],相当于*(p+1),==>s.p = 3;
        s.p = p;             //s.p指向了s.i
        s.p[1] = 1;          //s.p = 1,此时该指针变为非法
        s.p[0] = 2;          //p已非法,出错!
        return 0;
    }
      

  7.   

    s.p[1] = 1;s.p[1] 应该已经越界了
      

  8.   

    我也试了下:程序在
    s.p[1] = 1;//???
    s.p[0] = 2;//出错...
      

  9.   

    没运行,我猜也是
    s.p[1] = 1;
    s.p[0] = 2;两行都有问题。
      

  10.   

    p[0] = 4;
    p[1] = 3;
    s.p[1] = 1;
    s.p[0] = 2;
    这三句有错,p只是一指针,没有实际的地址;给一个没有地址的变量赋值,一定会出错的!
      

  11.   

    把栈画出来,5分钟就知道了,s.p[1] = 1的时候,s.p指向变成1了,而这块内存根部不属于它,因此,在给s.p[0]赋值的时候就会报错
      

  12.   

    常识:
    给指针赋任意值,没有错,比如int *p = NULL;
    给一个地址赋值,则要求这个地址存在且可写。比如*NULL = 0就错了。
      

  13.   

    --------------------Configuration: TEST22 - Win32 Debug--------------------
    Compiling...
    TEST22.CPP
    Linking...TEST22.exe - 0 error(s), 0 warning(s)
      

  14.   

    p[1] = 3;  // 这一步其实应该有问题的,只是碰巧那里正好是s.p的位置,所以就给s.p付值了.
    老实说这道题出的没有什么意义
      

  15.   

    S s;    //这里已经错了,S是一个结构类型名,前面必须加上关键字struct 。
    应该这样:struct S s;
      

  16.   

    s.p指向s.i
    s.p[1]=1;这句话修改了s.i的下一个地址即s.p的值
    使得s.p指向0x00000001
    s.p[0]=2;修改0x0000001地址处的值,错误
      

  17.   

    p[0]=4; //这里错了。因为p[0]是结构成员变量i的内存地址,把值4赋给它就是企图改变i的内存地址,这显然会引起错误!
      

  18.   

    s.p[0] = 2;出错
    因为s.p[1] = 1;这句已经给p的分配了p的地址了,包括p[0]。p[0]不能再赋值
    但是把这两句换过来就不会了
    s.p[0] = 2;
    s.p[1] = 1;
    这样就不会了出错了
      

  19.   

    ringphone(临风) 的解释正确。其实就是s.p被操作了。
      

  20.   

    p[1] = 3;
        s.p[1] = 1;
      

  21.   

    S s;
        int * p = &s.i;
        p[1] = 3;            //p[1],相当于*(p+1),==>s.p = 3;
        p[0] = 4;            //==> s.i = 4;
        s.p = p;             //s.p指向了s.i
        s.p[1] = 1;          //s.p = 1,此时该指针变为非法
        s.p[0] = 2;          //p已非法,出错!-----------------------严重同意。赫赫
      

  22.   

    void main()
    {
        int a;
        int * p ;
        p=&a;
        int *q=&a;
        q[1]=3;
    }
    这个那,为什么运行时会报错?
      

  23.   

    去这里看吧,
    http://blog.csdn.net/blankman/archive/2004/11/14/WE_MS_20041113.aspx
    答案是确定的,但解释则不一定了。