访问冲突读取位置0x00000003 我的程序在C++中有问题。我有一个模板类,它有一个函数bool,用于检查给定的单词或数组是否是回文。对于int和char,everythig都可以,程序生成“yes”,但对于string,程序启动时会给出

访问冲突读取位置0x00000003 我的程序在C++中有问题。我有一个模板类,它有一个函数bool,用于检查给定的单词或数组是否是回文。对于int和char,everythig都可以,程序生成“yes”,但对于string,程序启动时会给出,c++,visual-studio-2013,C++,Visual Studio 2013,PK4_5.exe中0x534408DA(msvcr120d.dll)处的首次偶然异常: 0xC0000005:访问冲突读取位置0x00000003。未处理 PK4_5.exe中0x534408DA(msvcr120d.dll)处的异常:0xC0000005: 访问冲突读取位置0x00000003 这个代码有什么问题 代码如下: 主要功能: #include "palindrom.h" int main(){ int iTab[] = { 1, 2, 3, 2, 1 }; cha

PK4_5.exe中0x534408DA(msvcr120d.dll)处的首次偶然异常: 0xC0000005:访问冲突读取位置0x00000003。未处理 PK4_5.exe中0x534408DA(msvcr120d.dll)处的异常:0xC0000005: 访问冲突读取位置0x00000003

这个代码有什么问题

代码如下:

主要功能:

#include "palindrom.h"
int main(){
    int iTab[] = { 1, 2, 3, 2, 1 };
    char cTab[] = "abcba";
    string word ("aaaa");

    palindrom<int> A;
    palindrom<char> B;
    palindrom<string> C;
    if (A.palindrome(iTab, 5))
        cout << "yes";
    if (B.palindrome(cTab, strlen(cTab)))
        cout << "yes";
    if (C.palindrome(&word, word.length()))
        cout << "yes";
    return 0;
}
#包括“palindrom.h”
int main(){
int iTab[]={1,2,3,2,1};
字符cTab[]=“abcba”;
字符串字(“aaaa”);
回文A;
回文B;
回文C;
if(A.回文(iTab,5))

cout问题在于,您将要从中创建回文的集合作为指针传递。这意味着,从
std::string
中,您将其视为字符串数组,因此执行
x[0]
以外的任何操作都将导致未定义的行为

而是将其作为非指针传递,并在需要时使用指针模板类型创建
回文

palindrom<int*> A;
palindrom<char*> B;
palindrom<string> C;
它也适用于
std::string

if(C.palindrome(&word,word.length())
更改为
if(C.palindrome(word.C_str(),word.length())


另外,不要将
using namespace std;
放在头文件中,否则包含头文件的所有内容都将导入namespace std,这可能不是期望的行为。

是时候学习如何使用调试信息进行编译以及如何使用调试器了。在学习模板之前,应该完成waaay。这很奇怪。是的,你可以n word.c_str()和pass,同时传递std::string。@tmp调用
c_str
将创建一个指向临时且最重要的常量字符串的指针。是的,它将创建常量char*类型。但在这种情况下,这将很好,因为它在内部用于读取(如x[i])…但我同意你的解决方案,因为它更一般化,常量引用应该是传递它的方式。
palindrom<int*> A;
palindrom<char*> B;
palindrom<string> C;
bool palindrome(const T& x, int length);