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

Ячейка заполненной строки не перезаписывается - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Дан текст из цифр и строчных латинских букв, за которым следует точка http://www.cyberforum.ru/cpp-beginners/thread796248.html
Дан текст из цифр и строчных латинских букв, за которым следует точка. Определите какие буквы- гласные (A,E,I,O,u)или согласных-больше в этом тексте.
C++ Даны координаты вершин много угольника Даны координаты вершин много угольника (x1,y1,x2,y2,...,x10,y10).Напишите программу для вычисления его перемитра (вычисление расстояния между вершинами оформить подпрограммой. http://www.cyberforum.ru/cpp-beginners/thread796246.html
Вычислить C++
Вычислить Z=(x+y)/(k*n),где x и k- сумма и количетсвоположительных элементов массива А(40), где y и n - сумма и количество отрицательных элементов массива B(50). Определение суммы и количества положительных и отрицательных элементов выполнить в подпрограмме.
C++ Рассчитать радиус окружности, вписанной в треугольник и описанной
Рассчитать радиус окружности, вписанной в треугольник и описанной вокруг треугольника, зная его стороны.
C++ как составить программу угадай цифру с 5 попыток? http://www.cyberforum.ru/cpp-beginners/thread796237.html
как составить программу угадай цифру с 5 попыток?
C++ возможно ли записать по другому? в задаче требуется написать программный код который будет возвращать процентное соотношение населения страны к миру. Вот сам код можно ли упростить строчки с long double преобразованиями? так как убирая их процент будет нулю а не 4.5. #include<iostream> #include<clocale> int main() { using namespace std; setlocale(LC_CTYPE,"Russian"); long long nas_z;//насиление земли cout<<"Введите... подробнее

Показать сообщение отдельно
Байт
 Аватар для Байт
13963 / 8794 / 1223
Регистрация: 24.12.2010
Сообщений: 15,927
01.03.2013, 14:37     Ячейка заполненной строки не перезаписывается
Jeironica, Давно хотел тут написать, но лапы как-то не доходили.
В том, что вы выделили проблемный код из большой программы - это совершенно правильный подход. Грамотный и гуманный. Теперь надо чтобы выделенная часть вела себя так же плохо, как и большая программа. Если это не так, то проблема в другом месте.
Надеюсь, что вы проверили плохое поведение этого куска. Теперь надо этот кусок буквально, т.е скопировав (а не переписав) прислать на форум. Место с x=='*'; меня смутило, в том смысле, что вы именно переписали, тем самым к уже существовавшим ошибкам добавили ошибки переписывания.
Ладно, это все методика, а теперь по существу вашего кода.
Есть указатель ar. Вы говорите ar = new char[12]. Что происходит. В куче выделяется кусок памяти на 12 байт и в ar помещается ссылка на этот кусок (адрес этого куска). Далее ar = "123456789"; Что теперь. В ar помещается адрес статической памяти, где находится строка "123456789". Результат предыдущей операции (ar = new...) затирается, в куче появляется мусор (память выделенная оператором new) которая уже совершенно недостижима, т.к. нету на нее указателя, и не сможет быть никогда освобождена. В вашем коде строчку ar = new... можно совершенно спокойно выбросить, только лучше станет.
Значит так. После ar = "12..."; он указывает на статическую памятью. И ar[4] = x; должен записывать в эту статическую память. И вот тут разные компиляторы ведут себя по-разному. Некоторые (старинные) позволяют в нее писать. Другие (более продвинутые) - запрещают. Что, если подумать - логично. Чтоб вас не запутать (видите, для объяснения 3-х строчек простого кода пришлось целое эссе генерить ) даю правильный вариант
C++
1
2
3
4
 char *ar = new char[12];
strcpy(ar, "0123456789"); // как учил [b]easybudda[/b]
char x = '*';
ar[4] = x;
Удачи!

Добавлено через 1 минуту
ITcrusader, опередили.
Но думаю и мое не повредит...

Добавлено через 14 минут
Хочу еще добавить. Очень похожие выражения
C
1
2
 char ar[] = "012345";
char *ar = "012345";
делают совершенно разные вещи. В первом случае в стеке выделяется 7 байтов и туда помещается строка (наподобие strcat).
Во втором память выделяется для указателя (обычно 4 байта) и в него помещается адрес на статическую память.
Хоть и говорят часто, что в Си массив и указатель это одно и тоже, но в самом деле это не совсем так.
 
Текущее время: 20:34. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru