Return 来自 char[256] 属性访问器的 char[256]

Return char[256] from an accessor of a char[256] attribute

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];
}

我正在为存取器苦苦挣扎。当我尝试使用 getInfo() 时,我得到一个 char*,因此有了

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

我明白了

╠╠╠╠╠╠╠╠test

我想我做事的方式不对,但我想不通..

顺便说一下,VScode 也警告我

info[256]=i[256]

告诉我可能写入了 257 个八位字节 (C6386),但我不明白...

你能帮帮我吗?谢谢!

这个构造函数的声明

A(char i[256]);

意义不大,因为编译器会像

一样调整参数声明
A(char *i);

考虑到这段代码

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

您似乎希望构造函数接受字符串。如果是这样,那么它应该声明为

A( const char * );

并且可以这样定义

#include <cstring>

//...

A::A( const char *i ){
    strncpy( info, i, sizeof( info ) );
    info[sizeof( info ) - 1] = '[=14=]';
}

成员函数getInfo应该return数组而不是不存在元素的地址info[256]

char * A::getInfo(){
    return info;
}

这个方法也应该被重载

const char * getInfo() const;

这个循环

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

应替换此语句

std::cout << d.getInfo();

问题是,您的构造函数没有正确初始化 info 数组的内容,并且您的访问器 return 使用了一个错误的指针。

在构造函数中,info[256]=i[256] 并没有按照您的想法去做。您正在尝试将 i 的第 257 个元素复制到 info 的第 257 个元素,这是未定义的行为,因为两个数组都没有 257 个元素。这就是编译器警告您的原因。

试试这个:

A::A(char i[256]){
    for(int x = 0; x < 256; ++x){
        info[x] = i[x];
   }
}

或者:

#include <algorithm>

A::A(char i[256]){
    std::copy_n(i, 256, info);
}

至于访问器,它是 return 指向不存在的第 257 个元素的指针。您需要 return 指向第一个元素的指针:

char * A::getInfo(){
    return(&info[0]);
}

或者简单地说:

char * A::getInfo(){
    return info;
}