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

Что происходит когда например "char* g="fdgag";"? - C++

Восстановить пароль Регистрация
 
NEW_NAME
1 / 1 / 0
Регистрация: 04.10.2012
Сообщений: 45
26.11.2012, 21:11     Что происходит когда например "char* g="fdgag";"? #1
Сабж. Я понял создается динамический массив с помощью malloc() и поэтому к нему не обратится таким образом: g[2]. Я прав?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
26.11.2012, 21:17     Что происходит когда например "char* g="fdgag";"? #2
Цитата Сообщение от NEW_NAME Посмотреть сообщение
создается динамический массив с помощью malloc()
Нет. Создается указатель на константный строковый литерал.
Цитата Сообщение от NEW_NAME Посмотреть сообщение
поэтому к нему не обратится таким образом: g[2]
На чтение можно обращаться.
zss
Модератор
Эксперт С++
 Аватар для zss
5942 / 5547 / 1783
Регистрация: 18.12.2011
Сообщений: 14,155
Завершенные тесты: 1
26.11.2012, 21:20     Что происходит когда например "char* g="fdgag";"? #3
g - указатель на константный текстовый массив.
Читать g[2] можно:
char c=g[2];
Писать - нельзя:
g[2]='a';// ошибка исполнения.
nshell32gmail
5 / 5 / 1
Регистрация: 26.11.2012
Сообщений: 19
26.11.2012, 21:21     Что происходит когда например "char* g="fdgag";"? #4
Вроде нет. Если ты не выделяешь память под массив явно, т.е. не используешь ни malloc(), ни new, то есть два выхода:
1. Если использовать таблицу строк, тогда пишешь так:
const char *arr = "my text";
Это создаст в файле программы в таблице строк строку "my text", свяжет указатель arr на константу по адресу этой строки и ее уже изменять во время выполнения программы, очевидно, будет нельзя нельзя.
2. Иначе выделяешь память для строки явно:
char *arr = new char[7]
или в стиле С
char *arr = (char*)malloc(sizeof(char)*7);
и в обоих случаях используешь strcpy(arr,"string\0");
--
вот как у тебя написано - так делать нельзя, но добросовестный компилятор сделает как в первом случае и выкинет warning, что инфа по указателю может измениться, а там уже непредсказуемые последствия, т.к. все что не запрещено, то разрешено и ты НАВЕРНЯКА рано или поздно захочешь изменить значение по указателю.
NEW_NAME
1 / 1 / 0
Регистрация: 04.10.2012
Сообщений: 45
26.11.2012, 21:38  [ТС]     Что происходит когда например "char* g="fdgag";"? #5
Почему кстати для этой штуки не работает _msize()? Для new char[4] к примеру работает.
BuPy7
Нет ТЗ - давай досвидания
 Аватар для BuPy7
747 / 344 / 30
Регистрация: 01.12.2011
Сообщений: 2,027
26.11.2012, 23:18     Что происходит когда например "char* g="fdgag";"? #6
Цитата Сообщение от NEW_NAME Посмотреть сообщение
создается динамический массив с помощью malloc()
Если вы программируете на C++, то от malloc, calloc, realloc - нужно отказаться. т.к. эти функции наследованные от C. В языке C++, для этих целей, используются функции new и delete.
nshell32gmail
5 / 5 / 1
Регистрация: 26.11.2012
Сообщений: 19
27.11.2012, 01:01     Что происходит когда например "char* g="fdgag";"? #7
Цитата Сообщение от Metallnote Посмотреть сообщение
Если вы программируете на C++, то от malloc, calloc, realloc - нужно отказаться. т.к. эти функции наследованные от C. В языке C++, для этих целей, используются функции new и delete.
Полностью согласен. Если использовать malloc() для класса, то память выделяется, но конструктор не вызывается.
NEW_NAME
1 / 1 / 0
Регистрация: 04.10.2012
Сообщений: 45
27.11.2012, 01:05  [ТС]     Что происходит когда например "char* g="fdgag";"? #8
Цитата Сообщение от Metallnote Посмотреть сообщение
Если вы программируете на C++, то от malloc, calloc, realloc - нужно отказаться. т.к. эти функции наследованные от C. В языке C++, для этих целей, используются функции new и delete.
Блин, да я даже не пользовался никогда этим. Меня интересовал механизм по которому создается такая строка как в шапке темы.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.11.2012, 01:41     Что происходит когда например "char* g="fdgag";"?
Еще ссылки по теме:

error C2664: strcmp: невозможно преобразовать параметр 1 из "char (*)[20]" в "const char *" C++
C++ Не открывается библиотека 'stdafx.h' и "char" не работает с параметром "char*"
Ошибка "error C2446: :: нет преобразования "int" в "char *" C++

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

Или воспользуйтесь поиском по форуму:
nshell32gmail
5 / 5 / 1
Регистрация: 26.11.2012
Сообщений: 19
27.11.2012, 01:41     Что происходит когда например "char* g="fdgag";"? #9
если в ассемблерном коде хоть что понимаешь и gcc есть - запусти с ключом -S. Получишь ассемблерный листинг. Как строка там оказалась - написал выше.
Yandex
Объявления
27.11.2012, 01:41     Что происходит когда например "char* g="fdgag";"?
Ответ Создать тему
Опции темы

Текущее время: 20:26. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru