Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.68/41: Рейтинг темы: голосов - 41, средняя оценка - 4.68
64 / 64 / 12
Регистрация: 05.07.2010
Сообщений: 219
1

Работа с массивом char

08.07.2010, 21:54. Показов 7779. Ответов 32
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день.
Объясните, если не сложно, на пальцах в чем ошибка?
C++
1
2
char*my1[]={"first my1","second my1"};
my1[0][0]='E';
Синтаксически все корректно.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.07.2010, 21:54
Ответы с готовыми решениями:

Работа с массивом char
Вот задание Вам дана непустая строка, состоящая из строчных латинских букв, цифр и пробелов....

Работа с массивом char
Товарищи подскажите пожалуйста, не могу никак понять в чём проблема. Есть массив скажем: int X;...

Работа с массивом символов Char
Народ помогите! 2. Дано целое число N и текстовый файл. Создать строковый файл, содержащий все...

работа с массивом символов типа Char
Пытаюсь разобраться со следующим заданием. Допустим есть некоторая строка большой длины, требуется...

32
Унылый школьник
126 / 60 / 10
Регистрация: 06.11.2009
Сообщений: 353
09.07.2010, 00:35 21
Author24 — интернет-сервис помощи студентам
Всегда рад помочь
0
Эксперт С++
2347 / 1720 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
09.07.2010, 01:00 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';
0
64 / 64 / 12
Регистрация: 05.07.2010
Сообщений: 219
09.07.2010, 01:22  [ТС] 23
CyBOSSeR, хотелось понять в чем ошибка в конкретном примере, а не получить готовое решение.
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
09.07.2010, 03:54 24
C
1
2
    printf("%c" "\n", "abcde"[2]);
    printf("%s" "\n", &"abcde"[2]);
насчёт обращения там всё правильно
в строковой константе ничего нельзя изменить до конца программы
две одинаковые строковые константы в разных местах программы, могут ссылаться на одну строку в памяти
0
34 / 34 / 8
Регистрация: 07.06.2010
Сообщений: 118
09.07.2010, 09:29 25
st_dent, Массив my1 у вас является одномерным так как в обьявлении только одна пара скобок [], если хотите обьявить массив двумерный то надо ставить две пары скобок my1[][].
По поводу обращения, то получается что первый оператор индексирования []вытаскивает из массива my1 строку, а второй уже применяется к строке что бы вытащить символ

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

Добавлено через 11 минут
как я понимаю это из за того что там строковые константы а если выделять память динамически то они таковыми являтся не будут так?
0
Унылый школьник
126 / 60 / 10
Регистрация: 06.11.2009
Сообщений: 353
09.07.2010, 09:31 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/%... 0%B8%D0%B8
1
Эксперт С++
2347 / 1720 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
09.07.2010, 09:52 27
Цитата Сообщение от st_dent Посмотреть сообщение
хотелось понять в чем ошибка в конкретном примере, а не получить готовое решение.
В твоем примере массив my1 содержит два указателя на строковые литералы, которые были помещены в область памяти только для чтения. Как правильно сказал accept:
Цитата Сообщение от accept Посмотреть сообщение
две одинаковые строковые константы в разных местах программы, могут ссылаться на одну строку в памяти
Отсюда и исключение, выбрасываемое при попытке записи в память только для чтения в строке:
Цитата Сообщение от st_dent Посмотреть сообщение
my1[0][0]='E';
В примере, приведеном мною в посте #22 массив arr содержит два массива символов, которые в отличии от строковых литералов, помещаются в память доступную для записи, что позволяет осуществлять изменение их содержания.
1
34 / 34 / 8
Регистрация: 07.06.2010
Сообщений: 118
09.07.2010, 14:42 28
Demihalf, в e-библиотеке эта книга у меня есть прочитал...
последний вопрос то есть когда используется strcpy а не оператор присвоения, то строки не будут только для чтения(константными) тогда для чего еще выделять память динамически?
0
Унылый школьник
126 / 60 / 10
Регистрация: 06.11.2009
Сообщений: 353
09.07.2010, 15:28 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, которая позволяет контролировать количество копируемых символов.
2
34 / 34 / 8
Регистрация: 07.06.2010
Сообщений: 118
09.07.2010, 16:27 30
Все я понял, я по началу хотел спросить а что если инициализировать указатель 0, но если подумать то это просто будет нулевой указатель который не указывает на область памяти в которую можно что то записать по этому нужно выделять память динамически или в стеке путем обьявления массива
Примеры мог не приводить уж как выделять память знаю
0
232 / 102 / 6
Регистрация: 18.04.2010
Сообщений: 294
15.07.2010, 21:31 31
Цитата Сообщение от Demihalf Посмотреть сообщение
Нужно использовать strcpy или, что желательнее, strncpy, которая позволяет контролировать количество копируемых символов.
Последний сплоит half-life был основан именно на этом упущении разрабов.
0
[Freeman]
15.07.2010, 21:43
  #32

Не по теме:

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

0
232 / 102 / 6
Регистрация: 18.04.2010
Сообщений: 294
15.07.2010, 21:51 33
На сервер отправлялся игрок(пакет), видимо, с каким-то значением выше заданного в параметре функции и сервер опадал в осадок. И весь фикс этой дырки заключался в изменении функции strcpy на strncpy.
Поэтому лучше заранее подстраховаться.
0
15.07.2010, 21:51
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.07.2010, 21:51
Помогаю со студенческими работами здесь

Битовые операции: работа с целым числом (long) как с "массивом" из четырех однобайтовых чисел (char)
задали задачу, не понимаю, что хотят от меня в условии:/ Вот само условие: Напишите функцию,...

Проблема с классом и массивом char-ов
Есть класс, содержащий одномерный массив из char-ов и методы для работы с ним. Проблема возникла в...

проблема с массивом типа CHAR
нужно выполнить функцию fopen() . которая кушает на вход указатель на массив char в качестве пути к...

Проблема с символьным массивом char
Доброго времени суток! char buffer; //buffsize принимается как аргумент функции и задает его...


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

Или воспользуйтесь поиском по форуму:
33
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru