Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

Выводятся две строки подряд при выводе лишь одной - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Двумерный вектор: можно ли как-то перегрузить [] чтобы доступ был [0, 0] http://www.cyberforum.ru/cpp-beginners/thread1244833.html
У меня есть двумерный вектор, можно как-то перегрузить чтобы доступ был ? А то сейчас сделал через прокси-класс , но все-таки хотелось бы вариант с одинарными.
C++ Возвращаемый тип конструктора копирования в абстрактном классе Здравствуйте! Есть абстрактный класс (с "чистыми" виртуальными функциями), и в нем необходимо явно определить конструктор копирования. Но если написать, что возвращаемый тип - сам класс, то... http://www.cyberforum.ru/cpp-beginners/thread1244724.html
Найти ошибку в программе C++
#include<iostream> #include<stdio.h> #include<vector> using namespace std; int main(){ int n; cin>>n; vector<int> g;
C++ Float показывает 0.00000
int n; float f; for(int i = 1; i<5; i++) { lvl.n = 1; stamina.n = 10+(lvl.n*2); Int.n = 10+(lvl.n*2); hp.n = 100+(stamina.n*4)+(lvl.n*2*4); mp.n = 50+(Int.n*2)+(lvl.n*2*2);
C++ Каким образом работает swap в приведенном коде? http://www.cyberforum.ru/cpp-beginners/thread1244636.html
Каким образом работает swap в коде ниже? #include<list> #include<memory> #include<utility> struct test { std::list<std::unique_ptr<int> >a,b; }; int main()
C++ Функция для проверки почтового адреса Мне нужно написать функцию, которая проверяет правильно ли введен почтовый адрес. Условий корректности много. Например, символ "точка" не должен располагаться сразу после символа "@". Я это условие... подробнее

Показать сообщение отдельно
tehnar5
31 / 31 / 12
Регистрация: 03.05.2011
Сообщений: 84
20.08.2014, 11:38
Представим память в виде массива. По всей видимости, происходит нечто следующее:
Сначала вы берете и помещаете в память две пустые строки. Это значит, что у вас есть два указателя - str1 и str2, которым нужно выделить только одну ячейку памяти(чтобы записать в нее 0 - символ конца строки). Эти блоки памяти могут быть расположены как угодно и где угодно, например, они могут быть расположены близко друг к другу. В Вашем случае они расположены как-то так:
....x...y...., где х - начало первой строки, а у - начало второй строки. Соответственно, после считывания первой строки память выглядит так: .....abcd0...., первая строка начинается с а, вторая с 0. Вывод будет работать корректно, так как он выводит по одному символу, пока не встретится 0. После считывания второй строки память выглядит так: ..abcdklmn0.., вторая строка так же выведется корректно, но теперь, технически, первая строка стала длиннее, так как ближайший справа 0 стал дальше.

Иными словами, если Вы не выделили память/выделили ее мало, то программа вполне может залезть в чужую память. В лучшем случае, это будет память другого процесса и тогда она вылетит с ошибкой, в худшем - это будет какая-то другая переменная. Как мне кажется, второй вариант тоже не правилен, так как надо указывать размер выделяемой памяти, но, по всей видимости, Вам повезло и память выделилась по-другому, подальше друг от друга. Самый правильный способ это new char[maxlength + 1], +1 нужен для того, чтобы хранить 0 - символ конца строки
0
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru