[英]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::string
, std::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.