繁体   English   中英

C ++指针和动态内存

[英]C++ pointers and dynamic memory

自从我做过C ++以来,已经有一段时间了,最​​近我一直在使用python和java,因此需要刷新指针。

#include <iostream>
using namespace std;
int main()
{
  char *s=new char;
  cin >>s;
  cout <<s<<endl;
  delete s;
  s=0;
  return 0;
 }

当我尝试执行此操作时,我了解到我有一个1字节大小的字符,当我键入存储的内容时; 我可以将其打印出来。 但是,如果我尝试大量输入,它将溢出,我知道大小是有限的。

现在我尝试了这个:

#include <iostream>
using namespace std;
int main()
{
  char *s=new char;
  cin >>*s;
  cout <<s<<endl;
  delete s;
  s=0;
  return 0;

}

仅存储我键入的首字母,i至* s首先与s [0]相同,但是即使这样,它也应将所有内容存储在s [0]中。

我不太确定如何理解这一点。

我也试过这个:

char *s=new char [2];
cin>>s; // i enter lets say "hello"
cout<<s[3]; // this prints out "l"; 

我不明白的是,当我说新字符[2]时,我到底做了什么,我分配了两个字符吗?,

当您说new char[2] ,您分配了一个长度为2 的字符数组

这意味着您有空间容纳两个char s,一个char位于s[0] ,另一个char位于s[1]

您可能会访问s[1]之外s[1] ,但是您发现的内容是不确定的-在此读取或写入内容可能会使您的程序崩溃或使其行为无法预测。

您在此处产生的结果称为缓冲区溢出 -恶意攻击者可能利用此溢出来使您的程序按其期望的方式运行。

我首先通过* s与s [0]相同

完全一样。

但是即使是这样,它也应该将所有内容都存储在s [0]中。

它如何存储“一切”? s[0]仅足以存储单个字符。

最近我一直在使用python和java,因此需要刷新指针

您需要的不仅仅是指针的更新,而且还有std::stringstd::vector和其他类,它们可以通过了解它们自己的大小而不会溢出来帮助您管理内存。

在第一个示例中,您正在分配一个字符,但您正在向cin传递一个char *,它将被视为字符串。 您可能只分配了一个字符,但它不知道,而是将一个接一个的字符放置在该单个分配的字符之后的内存中,直到引起问题为止。

在第二个示例中,您分配了相同的字符,但是将单个字符传递给cin,因此它将仅向其中读取单个字符。

在第三个示例中,您当然分配了两个字符,但是cin不在乎,数组解引用操作也不在意。 两者都假设您已经分配了足够的资源来使其工作。

下面是如何使用字符指针来跟踪字符串的方法。 如您所知,指针仅保存地址,因此它们不能保存字符数组中的所有字符。 这意味着当我们使用char *来跟踪字符串时,包含该字符串的字符数组必须已经存在,或者为了分配更好的单词(静态或动态)

char label[] = "Temperaure";
char label2[10] = "Cold";
char *labelPtr;
labelPtr = label;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM