Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
defer
秘密
558 / 238 / 16
Регистрация: 29.11.2010
Сообщений: 797
#1

Как это работает?

25.06.2012, 23:35. Просмотров 669. Ответов 14
Метки нет (Все метки)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
#include <cstring>
using namespace std;
 
int main()
{
    char* s=new char[100];
    s="Jonessssssssssssssssssssssss";
    char* l =new char[100];
    l="Doe";
 
    l=s;
    cout << s << endl;
    cout << l << endl;
 
    delete[] s;
    delete[] l;
 
    char* d=new char[100];
    d=l;
    cout << d << endl;
    cout << sizeof s << endl;
    cout << l << endl;
    return 0;
}

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.06.2012, 23:35
Ответы с готовыми решениями:

Как это работает? Я хочу спросить как работает C++ и где можно про него почитать
Привет, котоны. Заранее благодарю. Это будет моих общих вопросов нить, т.к....

Русификация.Работает-супер! Обьяснитте, как это работает?
#include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;windows.h&gt; using...

Как это работает?
Читаю я кое какой &quot;учебник&quot;, и в нём появился такой вот кусок кода int input...

Как это работает
Здравствуйте уважаемые форумчане!Как это работает? Как например предотвратить...

Как это работает?
Доброго времени суток. Граждане программисты, подскажите пожалуйста как...

14
LEQADA
Мастер кустарных методов
227 / 222 / 17
Регистрация: 09.11.2010
Сообщений: 680
25.06.2012, 23:54 #2
На GCC 4.6.1 не компилируется из-за предупреждений.
deprecated conversion from string constant to <char*> [-Wwrite-strings]
0
alsav22
5439 / 4834 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
25.06.2012, 23:59 #3
Цитата Сообщение от defer Посмотреть сообщение
delete[] s;
delete[] l;
Рано удаляешь.
0
Toshkarik
1149 / 866 / 90
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
26.06.2012, 00:01 #4
Тут в принципе удалять нельзя, вообще не верная работа с динамической памятью.
0
defer
秘密
558 / 238 / 16
Регистрация: 29.11.2010
Сообщений: 797
26.06.2012, 00:03  [ТС] #5
Цитата Сообщение от LEQADA Посмотреть сообщение
На GCC 4.6.1 не компилируется из-за предупреждений.
Компилируется и с -Wall и с-Pedantic-errors


Цитата Сообщение от alsav22 Посмотреть сообщение
Рано удаляешь.
вопрос: почему работает?
0
Toshkarik
1149 / 866 / 90
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
26.06.2012, 00:09 #6
Цитата Сообщение от defer Посмотреть сообщение
char* s=new char[100];
Здесь выделяется память в 100 байт, и адрес первого байта присваивается указателю.
Вот тут
Цитата Сообщение от defer Посмотреть сообщение
s="Jonessssssssssssssssssssssss";
указатель меняет свое значение, и начинается указывать на строковый литерал. Мало того, что теряется выделенная память 100 байт, что приводит к утечке, так еще и указатель не-const, что приводит к неопределенному поведению, так как строковый литерал сам по себе константный.
А вот тут скорей всего будет crash:
C++
1
2
delete[] s;
delete[] l;
0
alex_x_x
бжни
2455 / 1661 / 134
Регистрация: 14.05.2009
Сообщений: 7,162
26.06.2012, 00:10 #7
Цитата Сообщение от defer Посмотреть сообщение
вопрос: почему работает?
потому что везет, хотяяя

Bash
1
2
3
Jonessssssssssssssssssssssss
Jonessssssssssssssssssssssss
memory clobbered before allocated block
Добавлено через 1 минуту
я почти уверен, что если MALLOC_CHECK_ выставить в двойку, то программа радостно грохнется
0
Toshkarik
1149 / 866 / 90
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
26.06.2012, 00:10 #8
Цитата Сообщение от defer Посмотреть сообщение
Компилируется и с -Wall и с-Pedantic-errors
Тут, скорей всего, имелось ввиду с -Werror.
0
alsav22
5439 / 4834 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
26.06.2012, 00:17 #9
Из-за delete виснет.
0
alex_x_x
бжни
2455 / 1661 / 134
Регистрация: 14.05.2009
Сообщений: 7,162
26.06.2012, 00:26 #10
код неправильный - это очевидно
смысл обсуждать последствия
0
defer
秘密
558 / 238 / 16
Регистрация: 29.11.2010
Сообщений: 797
26.06.2012, 00:27  [ТС] #11
Цитата Сообщение от alsav22 Посмотреть сообщение
Из-за delete виснет.
какой компилятор?

Добавлено через 43 секунды
Цитата Сообщение от alex_x_x Посмотреть сообщение
код неправильный - это очевидно
смысл обсуждать последствия
Проблема в том, что он работает
0
Toshkarik
1149 / 866 / 90
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
26.06.2012, 00:29 #12
Вам уже сказали, что это всего лишь дело случая. Вам просто повезло, у данного кода неопределенное поведение, оно может быть каким угодно.
0
alex_x_x
бжни
2455 / 1661 / 134
Регистрация: 14.05.2009
Сообщений: 7,162
26.06.2012, 00:30 #13
Цитата Сообщение от defer Посмотреть сообщение
Проблема в том, что он работает
в чем проблема?
стандарт на такое говорит, что после таких действий программа может отформатировать ваш винчестер и будет права
undefined behavior и ее никто не ограничивает
0
Toshkarik
1149 / 866 / 90
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
26.06.2012, 00:30 #14
Вот можете посмотреть, что происходит на gcc 4.7.1. Да и на нем при определенных условиях возможна "правильная" работа, тут не столько от компилятора, сколько, опять же, от случая зависит.
0
tihonya
11 / 7 / 1
Регистрация: 30.05.2012
Сообщений: 113
26.06.2012, 00:59 #15
Вот немного подправил , здесь можно удалять, все будет работать.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <iostream>
#include <cstring>
using namespace std;
 
int main()
{
    char* s=new char[100];
    strcpy(s,"Jonessssssssssssssssssssssss");
    char* l =new char[100];
    strcpy(l,"Doe");
//    l=s;   //?? Адресу указателя l присваевается адрес указателя s 
    //тоесть два указателя указывают на одну и туже ячейку дважды  delete не пройдет
    cout << s << endl;
    cout << l << endl;
 
    delete[]s;
 //   delete[]l;
 
    char* d;//=new char[100];
    d=l;
    cout << d << endl;
    cout << sizeof s << endl;
    cout << l << endl;
    delete[]d; //  l мы удалили тоже
return 0;
 
}
нужно использовать strcpy для инициализации строковых переменных. и если присваивать указатель указателю d=l; то не обязательно выделять сразу под него память.
0
26.06.2012, 00:59
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.06.2012, 00:59

Как это работает?
Здравствуйте, можете, пожалуйста, поэтапно объяснить как работает приведенный...

Как это работает?
#include &lt;iostream&gt; int *fun() { int a = 5; return &amp;a; } int main() {...

объясните как это работает
#include &lt;iostream&gt; #include &lt;algorithm&gt; using namespace std; long...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru