C ++ указатели и динамическая память - PullRequest
1 голос
/ 01 февраля 2012

Прошло много времени с тех пор, как я сделал 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], что я точно сделал, я выделил два символа?,

Ответы [ 4 ]

2 голосов
/ 01 февраля 2012

i с первого по * s совпадает с s [0]

Точно так же.

, но даже если это так, оно должнохранить все в s [0].

Как можно хранить "все"?s[0] достаточно большой, чтобы хранить один символ.

недавно я использовал python и java, поэтому понадобилось обновить указатели

Что вам нужноне только освежитель указателей, но и std::string, std::vector и другие классы, которые помогают вам управлять памятью, зная их собственный размер и не допуская переполнения.

2 голосов
/ 01 февраля 2012

Когда вы сказали new char[2], вы выделили массив символов длиной два.

Это означает, что у вас есть место для двух char с, один на s[0] иодин на s[1].

Вы можете получить доступ за пределами s[1], но то, что вы обнаружите там, не определено - чтение или запись там могут привести к сбою вашей программы или вызвать ее непредсказуемое поведение.

Здесь вы создали то, что называется переполнением буфера - и злоумышленник может использовать это, чтобы заставить вашу программу вести себя так, как он хочет.

1 голос
/ 01 февраля 2012

В первом примере вы выделяете один символ, но вы передаете cin символ *, который будет рассматриваться как строка. Возможно, вы выделили только один символ, но он этого не знает и поместит символ за символом в память после этого выделенного символа, пока это не вызовет проблем.

Во втором примере вы выделили один и тот же символ, но передаете один символ в cin, и поэтому он будет читать только один символ.

В третьем примере вы определенно выделили два символа, но cin это не волнует, равно как и операция разыменования массива. Оба предполагают, что вы выделили достаточно для их работы.

0 голосов
/ 01 февраля 2012

Ниже показано, как вы можете использовать символьный указатель для отслеживания строки.Как вы знаете, указатели содержат только адреса, они не могут содержать все символы в массиве символов.Это означает, что когда мы используем char * для отслеживания строки, массив символов, содержащий эту строку, уже должен существовать или для лучшего распределения слов (статически или динамически)

char label[] = "Temperaure";
char label2[10] = "Cold";
char *labelPtr;
labelPtr = label;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...