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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
defer
秘密
555 / 235 / 3
Регистрация: 29.11.2010
Сообщений: 783
#1

Как это работает? - C++

25.06.2012, 23:35. Просмотров 635. Ответов 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++):

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

Русификация.Работает-супер! Обьяснитте, как это работает? - C++
#include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;windows.h&gt; using namespace std; char* Rus(const char* text); int main () ...

Как это работает? - C++
Доброго времени суток. Граждане программисты, подскажите пожалуйста как работает данный кусок кода??? А точнее дружественные функции...

Как это работает? - C++
Читаю я кое какой &quot;учебник&quot;, и в нём появился такой вот кусок кода int input (tank&amp; t, char map) { char act; int ch; int e =...

Как это работает? - C++
Здравствуйте, можете, пожалуйста, поэтапно объяснить как работает приведенный ниже фрагмент кода? Что такое floor, return, ceil? double...

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

14
LEQADA
Мастер кустарных методов
227 / 222 / 9
Регистрация: 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
5425 / 4820 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
25.06.2012, 23:59 #3
Цитата Сообщение от defer Посмотреть сообщение
delete[] s;
delete[] l;
Рано удаляешь.
0
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,386
Завершенные тесты: 1
26.06.2012, 00:01 #4
Тут в принципе удалять нельзя, вообще не верная работа с динамической памятью.
0
defer
秘密
555 / 235 / 3
Регистрация: 29.11.2010
Сообщений: 783
26.06.2012, 00:03  [ТС] #5
Цитата Сообщение от LEQADA Посмотреть сообщение
На GCC 4.6.1 не компилируется из-за предупреждений.
Компилируется и с -Wall и с-Pedantic-errors


Цитата Сообщение от alsav22 Посмотреть сообщение
Рано удаляешь.
вопрос: почему работает?
0
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,386
Завершенные тесты: 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
бжни
2449 / 1654 / 84
Регистрация: 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
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,386
Завершенные тесты: 1
26.06.2012, 00:10 #8
Цитата Сообщение от defer Посмотреть сообщение
Компилируется и с -Wall и с-Pedantic-errors
Тут, скорей всего, имелось ввиду с -Werror.
0
alsav22
5425 / 4820 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
26.06.2012, 00:17 #9
Из-за delete виснет.
0
alex_x_x
бжни
2449 / 1654 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
26.06.2012, 00:26 #10
код неправильный - это очевидно
смысл обсуждать последствия
0
defer
秘密
555 / 235 / 3
Регистрация: 29.11.2010
Сообщений: 783
26.06.2012, 00:27  [ТС] #11
Цитата Сообщение от alsav22 Посмотреть сообщение
Из-за delete виснет.
какой компилятор?

Добавлено через 43 секунды
Цитата Сообщение от alex_x_x Посмотреть сообщение
код неправильный - это очевидно
смысл обсуждать последствия
Проблема в том, что он работает
0
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,386
Завершенные тесты: 1
26.06.2012, 00:29 #12
Вам уже сказали, что это всего лишь дело случая. Вам просто повезло, у данного кода неопределенное поведение, оно может быть каким угодно.
0
alex_x_x
бжни
2449 / 1654 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
26.06.2012, 00:30 #13
Цитата Сообщение от defer Посмотреть сообщение
Проблема в том, что он работает
в чем проблема?
стандарт на такое говорит, что после таких действий программа может отформатировать ваш винчестер и будет права
undefined behavior и ее никто не ограничивает
0
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,386
Завершенные тесты: 1
26.06.2012, 00:30 #14
Вот можете посмотреть, что происходит на gcc 4.7.1. Да и на нем при определенных условиях возможна "правильная" работа, тут не столько от компилятора, сколько, опять же, от случая зависит.
0
tihonya
11 / 7 / 1
Регистрация: 30.05.2012
Сообщений: 107
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
Привет! Вот еще темы с ответами:

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

объясните как это работает - C++
#include &lt;iostream&gt; #include &lt;algorithm&gt; using namespace std; long func (long * arr, int length) { return...

как все это в подробностях работает? - C++
#include &lt;iostream&gt; #include&lt;cstdlib&gt; using namespace std; int main() { setlocale(LC_ALL, &quot;Russian&quot;); int i; int r; ...

объясните грамотно как это работает - C++
1)int * arr = NULL; и int * arr = new int;(что означает new) 2)можно менять int * arr = NULL на int * arr = {0} или int * arr = 0


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

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

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