【发布时间】:2018-10-02 18:27:51
【问题描述】:
当我们在堆中动态分配 5 个元素的内存时,为什么它会显示超过 5 个元素??? 在这个程序中,我制作了 char 指针 str 并给出了动态内存分配,但是当它接受动态内存的大小时,它显示的元素比给定的大小更多。例如:-如果我给出了 5 个字符数组,它显示的数量超过字符串的 5 个字符
#include<iostream>
#include<cstdlib>
using namespace std;
struct node
{
int tos;
int l;
char *str;
};
class balancing
{
struct node s;
public:
balancing();
balancing(int len);
void balance();
};
balancing::balancing()
{
s.tos=-1;
s.l=0;
s.str=NULL;
}
balancing::balancing(int le)
{
s.l=le;
s.str=new char[s.l];
s.tos=-1;
}
void balancing::balance()
{
int length;
char ch1;
cout<<"Enter the String"<<endl;
cin>>s.str;
cout<<s.str;
}
int main()
{
int len;
cout<<"Enter the Length"<<endl;
cin>>len;
balancing b(len);
b.balance();
return 0;
}
【问题讨论】:
-
cout<<"Enter the String"<<endl; cin>>s.str;输入什么字符串? -
请使用
std::string或至少std::vector<char>。 -
cin 不知道你的 char 数组的大小。它将写入内存,直到您的输入完成。这是一个字符串溢出,结果可能非常棘手,因为它取决于系统的当前状态。
-
在使用
cout << ...时,不要忘记对分配的char[]的内容进行空终止,否则会超出数组的边界进入周围的内存,直到找到一个nul字节,或因内存访问错误而崩溃。否则,请改用cout.write(),并明确传入char[]长度。其实你也应该使用cin.get(...)而不是cin >> ...,以确保在向数组中读取数据时不会超出数组的边界 -
当您输入的字符串长度超过了您正在写入的未为变量分配的内存中的长度时,例如,您可能会覆盖部分操作系统。
标签: c++ memory-management