時相剋在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