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

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

Войти
Регистрация
Восстановить пароль
 
NEW_NAME
1 / 1 / 0
Регистрация: 04.10.2012
Сообщений: 45
#1

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

26.11.2012, 21:11. Просмотров 414. Ответов 8
Метки нет (Все метки)

Сабж. Я понял создается динамический массив с помощью malloc() и поэтому к нему не обратится таким образом: g[2]. Я прав?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.11.2012, 21:11
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Что происходит когда например "char* g="fdgag";"? (C++):

В зависимости от времени года "весна", "лето", "осень", "зима" определить погоду "тепло", "жарко", "холодно", "очень холодно" - C++
В зависимости от времени года "весна", "лето", "осень", "зима" определить погоду "тепло", "жарко", "холодно", "очень холодно". Я так...

Что происходит при char *str = ""? - C++
Объясните, пожалуйста, что происходит при const chat *str = "hello" Т.е. тут явно у нас присутствует только объявления указателя str,...

Реализовать классы "Воин", "Пехотинец", "Винтовка", "Матрос", "Кортик" (наследование) - C++
Разработать программу с использованием наследования классов, реализующую классы: − воин; − пехотинец(винтовка); − матрос(кортик). ...

С++ консольное приложение win32, матерится на первое "pow" после "if", а на "system" говорит что неопределён. - C++
#define _CRT_SECURE_NO_WARNINGS #include "stdafx.h" #include <math.h> #include <iostream> #define Pi 3.1416 #include <clocale>...

Что Вы понимаете под "абстрактным типом", "абстракцией данных" и "абстрактными операциями"? - C++
А давайте займёмся археологией! И проследим как менялся смысл понятий "абстрактный тип данных", "абстракция данных" и "абстрактные...

Visual Studio не читает операторы, что начинаются на "glu" ("gluBuild2DMipmaps", "gluPerspective") - C++
Данный код должен выводить на экран кубик который должен вращаться, но возникла проблема. Для выполнения этого кода я подключи библиотеку...

8
fasked
Эксперт С++
4945 / 2525 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
26.11.2012, 21:17 #2
Цитата Сообщение от NEW_NAME Посмотреть сообщение
создается динамический массив с помощью malloc()
Нет. Создается указатель на константный строковый литерал.
Цитата Сообщение от NEW_NAME Посмотреть сообщение
поэтому к нему не обратится таким образом: g[2]
На чтение можно обращаться.
0
zss
Модератор
Эксперт С++
6484 / 6047 / 1985
Регистрация: 18.12.2011
Сообщений: 15,680
Завершенные тесты: 1
26.11.2012, 21:20 #3
g - указатель на константный текстовый массив.
Читать g[2] можно:
char c=g[2];
Писать - нельзя:
g[2]='a';// ошибка исполнения.
0
nshell32gmail
5 / 5 / 1
Регистрация: 26.11.2012
Сообщений: 19
26.11.2012, 21:21 #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, что инфа по указателю может измениться, а там уже непредсказуемые последствия, т.к. все что не запрещено, то разрешено и ты НАВЕРНЯКА рано или поздно захочешь изменить значение по указателю.
0
NEW_NAME
1 / 1 / 0
Регистрация: 04.10.2012
Сообщений: 45
26.11.2012, 21:38  [ТС] #5
Почему кстати для этой штуки не работает _msize()? Для new char[4] к примеру работает.
0
BuPy7
Нет ТЗ - давай досвидания
730 / 357 / 35
Регистрация: 01.12.2011
Сообщений: 2,148
26.11.2012, 23:18 #6
Цитата Сообщение от NEW_NAME Посмотреть сообщение
создается динамический массив с помощью malloc()
Если вы программируете на C++, то от malloc, calloc, realloc - нужно отказаться. т.к. эти функции наследованные от C. В языке C++, для этих целей, используются функции new и delete.
0
nshell32gmail
5 / 5 / 1
Регистрация: 26.11.2012
Сообщений: 19
27.11.2012, 01:01 #7
Цитата Сообщение от Metallnote Посмотреть сообщение
Если вы программируете на C++, то от malloc, calloc, realloc - нужно отказаться. т.к. эти функции наследованные от C. В языке C++, для этих целей, используются функции new и delete.
Полностью согласен. Если использовать malloc() для класса, то память выделяется, но конструктор не вызывается.
0
NEW_NAME
1 / 1 / 0
Регистрация: 04.10.2012
Сообщений: 45
27.11.2012, 01:05  [ТС] #8
Цитата Сообщение от Metallnote Посмотреть сообщение
Если вы программируете на C++, то от malloc, calloc, realloc - нужно отказаться. т.к. эти функции наследованные от C. В языке C++, для этих целей, используются функции new и delete.
Блин, да я даже не пользовался никогда этим. Меня интересовал механизм по которому создается такая строка как в шапке темы.
0
nshell32gmail
5 / 5 / 1
Регистрация: 26.11.2012
Сообщений: 19
27.11.2012, 01:41 #9
если в ассемблерном коде хоть что понимаешь и gcc есть - запусти с ключом -S. Получишь ассемблерный листинг. Как строка там оказалась - написал выше.
0
27.11.2012, 01:41
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.11.2012, 01:41
Привет! Вот еще темы с ответами:

Ошибка "error C2446: :: нет преобразования "int" в "char *" - C++
Ошибка: "error C2446: :: нет преобразования "int" в "char *" Когда нажимаю двойным кликом на ошибку меня перекидывает в файл...

Ошибка 6 error C2664: strtok: невозможно преобразовать параметр 1 из "const char *" в "char *" - C++
string s = "555 44 55 66";//размер строки заранее неизвестен char* p = strtok(s.c_str(), ' '); не нравится такое...

Создать абстрактный класс "Издание" и производные классы "Книга", "Статья", "Электронный ресурс" - C++
1. Создать абстрактный класс Издание с методами, позволяющими вывести на экран информацию об издании, а также определить является ли данное...

Создать класс "Вентилятор" содержащий в себе классы: "Двигатель", "Контроллер", "Пульт управления" - C++
Помогите с кодом написания задачи, не понимаю как написать классы в классе. Нужно создать класс "вентилятор" содержащий в себе классы:...


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

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

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