代码很复杂,因为它试图重复一个更复杂项目的错误(结果证明),这样更容易解决它。
#include <iostream>
#include <cstring>
using namespace std;
const int a = 50;
class chars {
char s[a], h[a], * j = 0, *f = 0;
public:
void set_s(char* b) {
j = s;
j = b;
}
void set_h(char* n) {
f = h;
f = n;
}
char *get_s() {
return j;
}
char* get_h() {
return f;
}
};
chars h[2];
void chars_1();
void out();
int main() {
int d = 5;
chars_1();
cin >> d;
out();
}
void chars_1() {
char c[a], d[a], * v = 0, *b = 0;
v = c;
b = d;
cin >> v;
cin >> b;
h[1].set_s(v);
h[1].set_h(b);
}
void out() {
cout << "\n";
cout << h[1].get_s() << "\n";
cout << h[1].get_h() << "\n";
}
在细分
int main() {
int d = 5;
chars_1();
cin >> d;
out();
}
如果涉及 cin >> d; ,则输出中断并显示根本不需要的内容,但如果注释掉这一行,则一切正常。

在向该类添加第二个字符数组之前,无论输入如何,一切都正常工作。在我看来,该错误与控制台的内存分配有关,但我不知道如何修复它以及这个假设是否普遍正确。

使用生命周期为函数的本地数组...
这是你写作
v的b地方h[1]-但就像函数中指向数组的指针
chars_1()一样。当您离开它时,数组将被销毁,指针仅保留在内存中可以安全重写的某些位置。典型的 UB(未定义行为)。一切。好吧,删除后似乎
cin >> d;一切正常的事实仅仅是因为在这种情况下,内存没有被意外覆盖。PS顺便说一句,你有很多额外的数组手势......例如,这个
在第一个任务中感觉?
j立即覆盖并指向b.似乎您并不真正了解所有这些带有数组和指针的机制是如何工作的......