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

Работа с массивом char - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 33, средняя оценка - 4.97
st_dent
64 / 64 / 3
Регистрация: 05.07.2010
Сообщений: 219
08.07.2010, 21:54     Работа с массивом char #1
Добрый день.
Объясните, если не сложно, на пальцах в чем ошибка?
C++
1
2
char*my1[]={"first my1","second my1"};
my1[0][0]='E';
Синтаксически все корректно.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.07.2010, 21:54     Работа с массивом char
Посмотрите здесь:

Проблема с классом и массивом char-ов. C++
C++ работа с массивом
C++ Работа с массивом char
Помощь с массивом char breed[4] = {'Dog ','Cat ', 'Rat ', 'Mouse '} C++
C++ Работа с массивом.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Demihalf
Унылый школьник
 Аватар для Demihalf
126 / 60 / 3
Регистрация: 06.11.2009
Сообщений: 354
09.07.2010, 00:35     Работа с массивом char #21
Всегда рад помочь
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2294 / 1664 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
09.07.2010, 01:00     Работа с массивом char #22
Вместо выделения памяти и прочего, не легче сделать:
C++
1
2
3
4
5
6
7
8
9
const size_t size       = 2;
const size_t max_length = 256;
 
char arr[size][max_length] = {
  { "first string" },
  { "second string" },
};
 
arr[0][0] = 'E';
st_dent
64 / 64 / 3
Регистрация: 05.07.2010
Сообщений: 219
09.07.2010, 01:22  [ТС]     Работа с массивом char #23
CyBOSSeR, хотелось понять в чем ошибка в конкретном примере, а не получить готовое решение.
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
09.07.2010, 03:54     Работа с массивом char #24
C
1
2
    printf("%c" "\n", "abcde"[2]);
    printf("%s" "\n", &"abcde"[2]);
насчёт обращения там всё правильно
в строковой константе ничего нельзя изменить до конца программы
две одинаковые строковые константы в разных местах программы, могут ссылаться на одну строку в памяти
[Freeman]
34 / 34 / 6
Регистрация: 07.06.2010
Сообщений: 118
09.07.2010, 09:29     Работа с массивом char #25
st_dent, Массив my1 у вас является одномерным так как в обьявлении только одна пара скобок [], если хотите обьявить массив двумерный то надо ставить две пары скобок my1[][].
По поводу обращения, то получается что первый оператор индексирования []вытаскивает из массива my1 строку, а второй уже применяется к строке что бы вытащить символ

Добавлено через 11 минут
Demihalf, обьясните почему происходит ACCESS VIOLATION

Добавлено через 11 минут
как я понимаю это из за того что там строковые константы а если выделять память динамически то они таковыми являтся не будут так?
Demihalf
Унылый школьник
 Аватар для Demihalf
126 / 60 / 3
Регистрация: 06.11.2009
Сообщений: 354
09.07.2010, 09:31     Работа с массивом char #26
[Freeman],указатель на указатель тоже вполне можно рассматривать, как двумерный массив. А массив как указатель. Я уже об этом писал. И обычно нормальные авторы пособий по Си/Си++ об этом говорят. (Пример: Джесс Либерти, Брэдли Джонс "Освой самостоятельно C++ за 21 день", пятое издание, страница 372 и вообще вся 13 глава)

И в том же сообщении я оставил ссылку на Википедию про ошибку сегментации (Access violation). Проблема та же, что в этом примере:
C
1
2
char *s = "hello world";
*s = 'H';
То есть указатель s указывает на область памяти с первым символом строки. Это ясно. Но строки в Си при присваивании таким образом создаются в памяти только для чтения. При попытке изменить константную для операционной системы строку, возникает ошибка доступа. Чтобы этого не было нужно использовать strcpy или strncpy

Вот еще раз ссылка, там написано подробнее:
http://ru.wikipedia.org/wiki/%D0%9E%...86%D0%B8%D0%B8
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2294 / 1664 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
09.07.2010, 09:52     Работа с массивом char #27
Цитата Сообщение от st_dent Посмотреть сообщение
хотелось понять в чем ошибка в конкретном примере, а не получить готовое решение.
В твоем примере массив my1 содержит два указателя на строковые литералы, которые были помещены в область памяти только для чтения. Как правильно сказал accept:
Цитата Сообщение от accept Посмотреть сообщение
две одинаковые строковые константы в разных местах программы, могут ссылаться на одну строку в памяти
Отсюда и исключение, выбрасываемое при попытке записи в память только для чтения в строке:
Цитата Сообщение от st_dent Посмотреть сообщение
my1[0][0]='E';
В примере, приведеном мною в посте #22 массив arr содержит два массива символов, которые в отличии от строковых литералов, помещаются в память доступную для записи, что позволяет осуществлять изменение их содержания.
[Freeman]
34 / 34 / 6
Регистрация: 07.06.2010
Сообщений: 118
09.07.2010, 14:42     Работа с массивом char #28
Demihalf, в e-библиотеке эта книга у меня есть прочитал...
последний вопрос то есть когда используется strcpy а не оператор присвоения, то строки не будут только для чтения(константными) тогда для чего еще выделять память динамически?
Demihalf
Унылый школьник
 Аватар для Demihalf
126 / 60 / 3
Регистрация: 06.11.2009
Сообщений: 354
09.07.2010, 15:28     Работа с массивом char #29
[Freeman], когда используется strcpy, она копирует все символы из source по необходимому адресу (destination). Если мы поступим так:
C
1
2
char* s;
strcpy(s, "Hello, world");
возникнет тот же пресловутый Access violation, так как указатель не инициализирован, он не указывает ни на какую область памяти. То есть, выделяя память под строку, мы получаем указатель на область памяти, которую можем менять:
C
1
2
s = (char*)malloc(sizeof(char) * 256);
strcpy(s, "Hello, world");
На C++:
C++
1
2
char* s = new char[256];
strcpy(s, "Hello, world");
Можно сделать по-другому:
C
1
2
char s[256];
strcpy(s, "Hello, world");
Здесь происходит что-то подобное, только вместо Кучи, строка хранится в стеке.

И вообще, присваивать строковой литерал указателю напрямую нельзя, кроме случая инициализации константы:
C
1
const char* = "Hello, world";
Нужно использовать strcpy или, что желательнее, strncpy, которая позволяет контролировать количество копируемых символов.
[Freeman]
34 / 34 / 6
Регистрация: 07.06.2010
Сообщений: 118
09.07.2010, 16:27     Работа с массивом char #30
Все я понял, я по началу хотел спросить а что если инициализировать указатель 0, но если подумать то это просто будет нулевой указатель который не указывает на область памяти в которую можно что то записать по этому нужно выделять память динамически или в стеке путем обьявления массива
Примеры мог не приводить уж как выделять память знаю
6a6kin
 Аватар для 6a6kin
232 / 102 / 2
Регистрация: 18.04.2010
Сообщений: 295
15.07.2010, 21:31     Работа с массивом char #31
Цитата Сообщение от Demihalf Посмотреть сообщение
Нужно использовать strcpy или, что желательнее, strncpy, которая позволяет контролировать количество копируемых символов.
Последний сплоит half-life был основан именно на этом упущении разрабов.
[Freeman]
15.07.2010, 21:43
  #32

Не по теме:

6a6ka, А можно об этом по подробнее?

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.07.2010, 21:51     Работа с массивом char
Еще ссылки по теме:

проблема с массивом типа CHAR C++
C++ Проверка массива char на равенство с таким же массивом
Работа с массивом символов Char C++

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

Или воспользуйтесь поиском по форуму:
6a6kin
 Аватар для 6a6kin
232 / 102 / 2
Регистрация: 18.04.2010
Сообщений: 295
15.07.2010, 21:51     Работа с массивом char #33
На сервер отправлялся игрок(пакет), видимо, с каким-то значением выше заданного в параметре функции и сервер опадал в осадок. И весь фикс этой дырки заключался в изменении функции strcpy на strncpy.
Поэтому лучше заранее подстраховаться.
Yandex
Объявления
15.07.2010, 21:51     Работа с массивом char
Ответ Создать тему
Опции темы

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