C++ 从char[256]属性的访问器返回char[256]

C++ 从char[256]属性的访问器返回char[256],c++,accessor,C++,Accessor,我正在和存取器搏斗。当我尝试使用getInfo时,我会得到一个char*,因此 class A{ char info[256]; public: char* getInfo(); A(char i[256]); //A.cpp #include "A.h" char * A::getInfo(){ return(&info[256]); } A::A(char i[256]){ info

我正在和存取器搏斗。当我尝试使用getInfo时,我会得到一个char*,因此

class A{
        char info[256];
        public:
        char* getInfo();
        A(char i[256]);

//A.cpp
#include "A.h"
char * A::getInfo(){
    return(&info[256]);
}
A::A(char i[256]){
    info[256]=i[256];
}
我想我做错事了,但我想不出来

顺便说一句,VScode还警告我

╠╠╠╠╠╠╠╠test
告诉我257个八位字节可能是C6386写的,但我不明白


你能帮我吗?谢谢

此构造函数的声明

info[256]=i[256]
没有太大意义,因为编译器将调整参数声明,如

A(char i[256]);
考虑到这个代码片段

A(char *i);
它可以定义为

A( const char * );
这个方法也应该重载

char * A::getInfo(){
    return info;
}
这个循环呢

const char * getInfo() const;
应替换此声明

for (int i = 0; i < 256; i++) {
    cout << d.getInfo()[i] ;
}

问题是,构造函数没有正确初始化info数组的内容,并且访问器返回了错误的指针

在构造函数中,info[256]=i[256]并不像您认为的那样。您试图将i的第257个元素复制到info的第257个元素中,这是未定义的行为,因为两个数组都没有257个元素。这就是编译器警告您的原因

请尝试以下方法:

A::亚喀尔一世[256]{ forint x=0;x<256;++x{ 信息[x]=i[x]; } } 或者:

包括 A::亚喀尔一世[256]{ std::复印件,256,信息; } 至于访问器,它返回一个指向不存在的257元素的指针。您需要返回指向第一个元素的指针:

char*A::getInfo{ 返回&信息[0]; } 或者简单地说:

char*A::getInfo{ 退货信息; }
此外,不能从C或C++中的函数返回数组。这样不行。在C++中,使用STD::Orle而不是普通数组,并且可以从函数返回。您仍然需要修复损坏的构造函数。您应该有一个默认构造函数,一个没有参数的构造函数。您应该通过引用传递数组,这样编译器在传递给函数时就不会复制了。@SamVarshavchik显示的访问器没有问题。它不是返回数组,而是返回指向数组第一个元素的指针,这是完全合法的。@ThomasMatthews数组不能按值传递,因此没有复制。。在这段代码中,数组通过隐式指针传递给构造函数。
char * A::getInfo(){
    return info;
}
const char * getInfo() const;
for (int i = 0; i < 256; i++) {
    cout << d.getInfo()[i] ;
}
std::cout << d.getInfo();