C++指针与动态内存 P>已经有一段时间了,我已经做了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; }

C++指针与动态内存 P>已经有一段时间了,我已经做了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; },c++,pointers,C++,Pointers,当我尝试这样做时,我知道我有一个大小为1字节的字符,当我输入一些东西时,它被存储起来;我可以把它打印出来。但是如果我尝试一个大的输入,它就会溢出,我知道大小是有限的 现在我试着这样做: #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;
char *s=new char [2];
cin>>s; // i enter lets say "hello"
cout<<s[3]; // this prints out "l"; 
}

只存储我键入的第一个字母,i first到*s与s[0]相同,但即使如此,它也应该将所有内容存储在s[0]中

我不太清楚如何理解这一点

我也试过这个:

#include <iostream>
using namespace std;
int main()
{
  char *s=new char;
  cin >>*s;
  cout <<s<<endl;
  delete s;
  s=0;
  return 0;
char *s=new char [2];
cin>>s; // i enter lets say "hello"
cout<<s[3]; // this prints out "l"; 
我不明白的是,当我说新字符[2]时,我到底做了什么,我分配了两个字符吗?

当你说新字符[2]时,你分配了一个长度为2的字符数组

这意味着您有两个角色的空间,一个在s[0],一个在s[1]

您可以访问s[1]之外的内容,但您发现其中存在未定义的内容—在那里读或写可能会使程序崩溃或以不可预知的方式运行

您在这里产生的是所谓的缓冲区溢出,恶意攻击者可以利用此漏洞使您的程序按照他们的意愿运行。

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

这意味着您有两个角色的空间,一个在s[0],一个在s[1]

您可以访问s[1]之外的内容,但您发现其中存在未定义的内容—在那里读或写可能会使程序崩溃或以不可预知的方式运行


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

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

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


在第三个示例中,您当然分配了两个字符,但cin不关心,数组解引用操作也不关心。他们都认为你已经分配了足够的资源让他们工作

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

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

在第三个示例中,您当然分配了两个字符,但cin不关心,数组解引用操作也不关心。他们都认为你已经分配了足够的资源让他们工作

i first-to*s与s[0]相同

完全一样

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

它怎么能储存所有东西?s[0]的大小仅足以存储单个字符

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

您需要的不仅仅是对指针的刷新,还包括std::string、std::vector和其他类,它们可以帮助您通过了解自己的大小来管理内存,并且不会让您溢出

i first-to*s与s[0]相同

完全一样

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

它怎么能储存所有东西?s[0]的大小仅足以存储单个字符

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


您需要的不仅仅是对指针的刷新,还包括std::string、std::vector和其他类,它们可以帮助您管理内存,因为它们知道自己的大小,并且不会让您溢出。

下面是如何使用字符指针跟踪字符串。正如您所知,指针只保存地址,不能保存字符数组中的所有字符。这意味着,当我们使用char*来跟踪字符串时,包含该字符串的字符数组必须已经存在,或者为了更好地使用单词allocatedstaticaly或dynamicaly

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

下面是如何使用字符指针跟踪字符串。正如您所知,指针只保存地址,不能保存字符数组中的所有字符。这意味着,当我们使用char*来跟踪字符串时,包含该字符串的字符数组必须已经存在,或者为了更好地使用单词allocatedstaticaly或dynamicaly

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

是的,我认为你分配了两个charsIt很令人不安,有三个答案,只有一个人指出
他使用C++而不使用字符串。或者他写的是C++,像java一样。请考虑使用STD::vector和STD::Stru.是的,我认为你分配了两个查特的干扰,有三个答案,只有一个人指出他使用C++而不使用字符串。或者他写的C++类似java。请考虑使用STD::vector和STD::Stru.对不起,我不知道,它只保留1字符,1字节,我不知道,它只保留1字符,1字节。