C ++指针和动态内存

时间:2012-02-01 03:56:10

标签: c++ pointers

我已经做了一段时间,因为我已经完成了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;

}

只存储了我键入的第一个字母,我首先通过* 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]时,我到底做了什么,我是否分配了两个字符?,

4 个答案:

答案 0 :(得分:2)

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

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

你可以访问s[1]以外的内容,但你发现的内容是未定义的 - 在那里阅读或写作可能会导致程序崩溃或使其以不可预测的方式运行。

您在这里产生的是所谓的缓冲区溢出 - 恶意攻击者可以利用它来使您的程序按照自己的意愿运行。

答案 1 :(得分:2)

  

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

相同

完全相同。

  

但即使如此,也应将所有内容存储在s [0]中。

如何存储“一切”? s[0]只能存储一个字符。

  

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

你需要的不仅仅是对指针的复习,而是std::stringstd::vector和其他类,它们通过了解自己的大小而不会让你溢出来帮助你管理内存。

答案 2 :(得分:1)

在第一个示例中,您正在分配单个字符,但是您将cin传递给char *,它将其视为字符串。您可能只分配了一个字符,但它不知道这一点并将字符后面的字符放入该单个分配字符后的内存中,直到它导致问题。

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

在第三个例子中,你当然分配了两个字符,但cin并不关心,数组解引用操作也没有。两者都假设你已经分配足够的工作量。

答案 3 :(得分:0)

下面是如何使用字符指针跟踪字符串。如您所知,指针只保存地址,它们无法保存字符数组中的所有字符。这意味着当我们使用char *来跟踪字符串时,包含字符串的字符数组必须已经存在或者用于更好的单词分配(staticaly或dynamicaly)

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