【问题标题】:c++ dynamic memory Allocation in stackc ++动态内存分配在堆栈中
【发布时间】: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&lt;&lt;"Enter the String"&lt;&lt;endl; cin&gt;&gt;s.str; 输入什么字符串?
  • 请使用std::string或至少std::vector&lt;char&gt;
  • cin 不知道你的 char 数组的大小。它将写入内存,直到您的输入完成。这是一个字符串溢出,结果可能非常棘手,因为它取决于系统的当前状态。
  • 在使用cout &lt;&lt; ...时,不要忘记对分配的char[]的内容进行空终止,否则会超出数组的边界进入周围的内存,直到找到一个nul字节,或因内存访问错误而崩溃。否则,请改用cout.write(),并明确传入char[] 长度。其实你也应该使用cin.get(...)而不是cin &gt;&gt; ...,以确保在向数组中读取数据时不会超出数组的边界
  • 当您输入的字符串长度超过了您正在写入的未为变量分配的内存中的长度时,例如,您可能会覆盖部分操作系统。

标签: c++ memory-management


【解决方案1】:

你的问题归结为,

char str[2]={'H','i'};
cout<<str; // why doesn't this print 2 characters?

答案是因为要将字符数组用作字符串,它必须以空值结尾。任何需要空字符的字符串处理代码都将继续执行,直到找到一个(或因为没有找到而导致问题)。

【讨论】:

  • 建议调整以消除一些歧义:“因为代表字符串的字符数组必须以空值结尾。”
  • cin 会在字符串后自动添加一个空终止符。
猜你喜欢
  • 2019-05-17
  • 2011-09-14
  • 2011-12-01
  • 2010-12-11
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
  • 2017-01-04
  • 2018-07-24
相关资源
最近更新 更多