【问题标题】:Unhandled exception at 0x00de1818 in 2.exe: 0xC0000005: Access violation writing location 0xcd7cbe102.exe 中 0x00de1818 处未处理的异常:0xC0000005:访问冲突写入位置 0xcd7cbe10
【发布时间】:2017-09-19 16:38:30
【问题描述】:

这是我的程序 联系方式.h

#include <string>
#include <sstream>
#include <iostream>
using namespace std;
#pragma once
class Contact
{
private:
char *Name;
char *Last;
int Phone;
char *Address;


public:
    Contact operator +(Contact NewVal);
    Contact(char *newName,char *newLastName,char *newAddress,int newPhone);
    Contact(void);
    ~Contact(void);




void SetName(char *newName);
void SetLastName(char *newLastName);
void SetAddress(char *newAddress);
void SetPhone(int newPhone);


char* Contact::GetLast(void);
char* Contact::GetAddress(void);
int Contact::GetPhone(void);
char* GetName(void);

};

联系人.cpp

#include "StdAfx.h"
#include "Contact.h"


Contact::Contact(void)
{
}
Contact::Contact(char *newName,char *newLastName,char *newAddress,int newPhone)
{
    SetName(newName);
    SetLastName(newLastName);
    SetAddress(newAddress);
    SetPhone(newPhone);

}


Contact::~Contact(void)
{
}


void Contact::SetName(char *newName){
    Name=_strdup(newName);
}

void Contact::SetLastName(char *newLastName){
    Last=strdup(newLastName);
}

void Contact::SetAddress(char *newAddress){
    Address=strdup(newAddress);
}

void Contact::SetPhone(int newPhone){
    Phone=newPhone;
}

char* Contact::GetName(void)
{
    return Name;
}
char* Contact::GetLast(void)
{
    return Last;
}
char* Contact::GetAddress(void)
{
    return Address;
}
int Contact::GetPhone(void)
{
    return Phone;
}

Contact Contact::operator+(Contact NewVal)
{

            //strcat(this->Address,NewVal.Address);
            //strcat(this->Last,NewVal.Last);
            //strcat(this->Name,NewVal.Name);
            this->Phone=this->Phone+NewVal.Phone;
            sprintf(this->Address,"%s %s",this->Address,NewVal.Address);
            sprintf(this->Name,"%s %s",this->Name,NewVal.Name);
            sprintf(this->Last,"%s %s",this->Last,NewVal.Last);

            return *this;

}

电话簿.h

#include "Contact.h"
#pragma once
class PhoneBook
{
private:
        Contact member[100];
        int ID;
public:

    PhoneBook(void);
    ~PhoneBook(void);
    Contact Search(char* newName);
    bool AddNewContact(char* NewName, char* NewLast, char* NewAddress,int NewPhone);
    void ShowContacts(void);
};

电话簿.Cpp

#include "StdAfx.h"
#include "PhoneBook.h"


PhoneBook::PhoneBook(void)
{

}


PhoneBook::~PhoneBook(void)
{

}


Contact PhoneBook::Search(char* newName)
{

    return Contact();
}


bool PhoneBook::AddNewContact(char* NewName, char* NewLast, char* NewAddress,int NewPhone)
{
    ID=ID+1;
    member[ID].SetName(NewName);
    member[ID].SetLastName(NewLast);
    member[ID].SetAddress(NewAddress);
    member[ID].SetPhone(NewPhone);
    return true;
}


void PhoneBook::ShowContacts(void)
{
    for(int a=0;a<=ID;a++){
        cout<<"Name:"<<member[ID].GetName()<<endl<<"LastName:"<<member[ID].GetLast()<<endl<<"Address:"<<member[ID].GetAddress()<<endl<<"Phone:"<<member[ID].GetPhone()<<endl;
    }
}

执行这些行后,我得到访问冲突错误(对于 SetName 函数)

int _tmain(int argc, _TCHAR* argv[])
{
    PhoneBook mem;

    mem.AddNewContact("Bob","Jones","LA",100);


    return 0;
}

但是这段代码可以正常工作!!!这意味着 Contact.h 文件中的 Set 函数可以正常工作,但添加电话簿类后它将无法正常工作。

int _tmain(int argc, _TCHAR* argv[])
{
    PhoneBook mem;
    Contact no("Bob","Jones","LA",100);
    //mem.AddNewContact("Bob","Jones","LA",100);


    return 0;
}

如果你能帮助我,我将不胜感激。

【问题讨论】:

  • 如果您能提供一个最小的、完整且可验证的示例,您可能会在您的问题上获得更多帮助。
  • 你在哪里初始化ID?
  • 附带说明,如果您要使用 char* 而不是 std::string 等,为什么还要包含
  • 亲爱的 Gary 很抱歉源代码太长,但正如您所见,我想清楚地展示我的问题。亲爱的史蒂夫感谢您的提示,它工作正常。另外我忘了删除两个未使用的库。

标签: c++


【解决方案1】:

对不起我的错误。我忘记为 ID 变量设置默认值。 感谢 Steve 和 Gray 的 cmets。

【讨论】:

    猜你喜欢
    • 2019-03-16
    • 1970-01-01
    • 1970-01-01
    • 2013-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-03
    • 2013-02-14
    相关资源
    最近更新 更多