ConsoleApplication2.exe中的第一次机会异常:0xC0000005:访问冲突写入,c ++

时间:2014-11-02 00:27:02

标签: c++ pointers access-violation xor

我正在尝试使用某些代码并尝试使其正常工作,但似乎我错过了一些东西...... 所以有人可以告诉我,我错过了什么或做错了什么?节目休息时间  *(sData->pFileBuffer+i) ^=*(sData->pKey+j);

以下是完整代码: 我在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;
}

1 个答案:

答案 0 :(得分: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 ++ - 就像其中一样。