时相克在Linux ++编译此代码工作正常,但是当我尝试在2015年VS(包括调试和释放)来执行他们,我收到运行时错误。它出什么问题了?运行时错误访问时,在VS2015类成员,但不是在Linux上
#include "stdafx.h"
#include <string.h>
#include <iostream>
using namespace std;
struct Stru1
{
int mem;
};
struct Stru2 : public Stru1
{
char szMem1[256];
int dwMem2;
int dwMem3;
};
static void clFun(Stru1* s) {
Stru2* s2 = (Stru2*)s;
cout << s2->szMem1 << endl;//blahblah
cout << s2->dwMem2 << endl;//runtime error
}
class Temp {
public:
void callDispatch() {
simRecv->mem = 2;
Stru2* sro = (Stru2*)simRecv;
strcpy(sro->szMem1, "blahblah");
sro->dwMem2 = 11;
sro->dwMem3 = 77;
//cout << sro->szMem1 << endl;//blahblah
//cout << sro->dwMem2 << endl;//runtime error when uncommented
clFun(simRecv);
}
~Temp() { delete simRecv; }
Stru1* simRecv = new Stru1;
};
int main()
{
Temp tmp;
tmp.callDispatch();
return 0;
}
错误: 异常在ConsoleApplication1.exe中在0x0000000077A0F23C(ntdll.dll中)抛出:0000005:访问冲突读取位置0x00000FB00188C508。
所以你分配内存'Stru1',将其转换为'Stru2 *'它有不同的成员和所期望的一切工作。? –
您已经分配了sinRecv = Stru1(带有“new Stru1”),然后将指针投射到Stru2。 “新”分配的sizeof(Stru1),所以试图去指向Stru2的指针正在分配结束。 – Robinson
'Stru2 * sro =(Stru2 *)simRecv;' - 从这行代码中删除转换。现在**仔细阅读** [您从编译器得到的错误](http://ideone.com/ISu20W)。同样的事情[这里](http://rextester.com/FYCVU59942)。错误说的是什么?你是否听过你的编译器?不,你继续申请一个演员阵容,“关闭编译器”。 – PaulMcKenzie