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; }
当我尝试这样做时,我知道我有一个大小为1字节的字符,当我输入一些东西时,它被存储起来;我可以把它打印出来。但是如果我尝试一个大的输入,它就会溢出,我知道大小是有限的 现在我试着这样做: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
#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字节。