簡體   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