2014-11-02 57 views
-1

我正在玩一些代碼,並試圖使其工作,但似乎我失去了一些東西... 所以任何人都可以請告訴我我錯過了什麼或做錯了什麼?在 *(sData->pFileBuffer+i) ^=*(sData->pKey+j);ConsoleApplication2.exe中的第一次機會異常:0xC0000005:訪問衝突寫入,C++

以下程序中斷是全碼: 我編譯在Visual Studio 2012,如果說有什麼關係呢?

#include <iostream> 
using namespace std; 

/* 
struct StubData{ 
char * pFileBuffer; 
long long FileSize; 
char * pKey; 
long KeySize; 
};*/ 


class StubData{ 
public: 
    char *pFileBuffer; 
    long long FileSize; 
    char *pKey; 
    long KeySize; 
    StubData(){} 
}; 





void Decrypt(StubData * sData){ 
    int i=0,j=0; 


for(i;i<sData->FileSize;i++){ 
    *(sData->pFileBuffer+i) ^=*(sData->pKey+j); 
    j++; 
    if (j>=sData->KeySize)j=0; 
} 

} 


void Encrypt(StubData * sData){ 
    int i,j; 

    sData->pKey="mysecretpassword"; 
    sData->KeySize=strlen(sData->pKey); 

    j=0; 

    printf("[*]Encoding\n"); 
    for(i=0;i<sData->FileSize;i++) 
    { 
     *(sData->pFileBuffer+i) ^=*(sData->pKey+j); 
     j++; 
     if (j>=sData->KeySize)j=0; 
    } 
} 


void main(){ 
    //StubData S; 
    StubData *S = (StubData *)malloc(sizeof(StubData)); 
    new (S) StubData; 

    S->pFileBuffer="MARKO"; 
    S->FileSize=strlen(S->pFileBuffer); 

    Encrypt(S); 
    cout<<"\nenc\n"<<S->pFileBuffer; 

    Decrypt(S); 
    cout<<"\ndec\n"<<S->pFileBuffer; 
} 

回答

0

您分配一個系統字符字符串文本S->pFileBuffer

S->pFileBuffer="MARKO"; 

這些字符串字面量是不變的(通常編譯成.rodata)。如果你想要一個可變的字符串,你應該在某處分配它。

你可以做這樣的事情

char str[] = "MARKO"; //be careful, if this goes out of scope before S, then S has a dangling pointer 
S->pFileBuffer=str; 

這是不是很C++ - 等。但是其餘的代碼似乎並不像C++那樣。

+0

謝謝你解釋問題出在哪裏,並建議, ,但它仍然在同一條線... – perunswrath 2014-11-02 00:59:37

+0

@perunswrath無法重現:http://ideone.com/75to16發佈更新後的代碼,因爲你編譯它如果您仍然遇到問題 – PeterT 2014-11-02 01:05:49

+0

非常感謝您......現在可以運行:) – perunswrath 2014-11-02 01:26:10

相關問題