我们使用下面的结构。
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没有?
答案 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一起使用。