为什么在Visual C ++中结构中的指针出现错误但是GCC没有?

时间:2018-02-26 07:57:36

标签: c++ visual-c++

我们使用下面的结构。

struct  S
{
    int i;
    int *p;
};

主要流程:

int main()
{
    S s;
    int *p = &s.i;
    p[0] = 4;
    p[1] = 3;
    printf("p[0]=%d\n", p[0]);
    printf("p[1]=%d\n", p[1]);
    s.p = p;
    s.p[0] = 1;
    s.p[1] = 2;

    printf("p[0]=%d\n", p[0]);
    printf("p[1]=%d\n", p[1]);

    return 0;
}

然后,当我们使用Visual C ++编译它时,我们的进程运行它在 s.p [1] = 1 中发生了内存错误。

但是当我们用GCC编译它时它可以运行。

为什么VC ++中出现错误但GCC没有?

2 个答案:

答案 0 :(得分:7)

p[1] = 3;的行为未定义

p 指向至少包含两个元素的数组。

答案 1 :(得分:2)

这句话:

int* p = &s.i;

您正在使用一个对象的地址初始化指针p,而不是数组。但是:

p[1] = 3;

s.p[1] = 2;

您正在尝试设置某个第二个数组元素的值,但是没有数组可以开始。这会导致undefined behavior

据说p中的main与您班级中的int* p数据成员无关。由于_tmain是Microsoft Visual C ++扩展,因此它很可能与GCC一起使用。