Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
25 / 25 / 5
Регистрация: 28.12.2009
Сообщений: 85
1

Несколько вопросов по строкам в С

30.04.2010, 23:49. Просмотров 536. Ответов 5
Метки нет (Все метки)

Привет всем участникам форума. Изучаю С++, по пути прошел строки из С ( массивы символов )
И осталось несколько вопросов, ответов на которые в книге найти не могу.
1:
C++
1
char *ptr="String1";
так мы создаем указатель который указывает на строку String1.
А можно ли делать вот так ?
C++
1
2
char *ptr = "String1";
ptr = "long string2";
я думал, что работать не должно, но оно работает, тоесть после этого указатель ptr указывает на "long string2" и, я еще заметил, что ptr стал указывать на другую область памяти. MVS 2010 никаких ошибок с памятью не выдает. Вопрос, почему ? получается что компилятор сам пересоздает для указателя ptr массив символов и пишет туда "long string2" ?
2:
Области видимости массивов и строк
допустим есть функция
C++
1
2
3
4
5
char *create()
{
    char *ptr = "string";
    return ptr;
}
и дальше функция main()
C++
1
2
3
4
5
void main()
{
    char *str;
    str = create();
}
Такой код "правильный" ? И когда умрет массив "string", созданый в функции ?
3:
Такой вопрос.
Допустим создаем массив символов
C++
1
char str[10];
а потом бац.. и копируем в него большую строку с помощью функции strcpy
C++
1
strcpy(str,"LONG LONG STRING");
по идее должно выдать ошибку записи в память, но нифига не выдает. Почему ?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.04.2010, 23:49
Ответы с готовыми решениями:

Несколько вопросов по С
Доброго времени суток! Интересует вопрос можно ли на C в функции, чтобы она возвращала несколько...

Несколько вопросов!
Вопрос 1) Вот код поисковика. Когда я удаляю Name поля Edit1 при запуске прогамы выдает ошибку->...

Несколько вопросов
Всем привет, появилось пару вопросов. 1. Стандартно TGauge имеет вид типа , но это выглядит совсем...

Несколько вопросов.
Как проверить в бане сайт или нет? Как посмотреть статистику сколько человек ищят по...

5
1993 / 1593 / 488
Регистрация: 31.05.2009
Сообщений: 2,980
01.05.2010, 05:05 2
1. А почему это не должно работать?
А вот неконстантный указатель на константную область памяти не есть хорошо.
C++
1
2
// тип строковых литералов всегда array of n const char(т.е. в данном случае const char[8])
const char *ptr = "String1";
иначе, что мешает сдалать
C++
1
2
// изменение константной памяти, результат не определён
ptr[0] = 's';
2. Код правильный(если не учитывать некостантный указатель). "string" это строковый литерал. Все строковые литералы имеют, как написано в стандарте, static storage duration, т.е. существуют на протяжении всей работы программы. Возвращать указатель на локальный объект не следует, строковые же литералы к локальным объектам не относятся.
3. В C++ нет контроля выхода за пределы массива. Поэтому вы вполне можете затереть какой-нибудь соседний массив таким образом. В общем, так лучше не делать
1
4848 / 3269 / 466
Регистрация: 10.12.2008
Сообщений: 10,569
01.05.2010, 07:48 3
C
1
2
    char *ptr = "String1";
    ptr = "long string2";
сначала в ptr записывается адрес одной строки, потом записывается адрес другой строки
заодно проверь потом printf("%s" "\n", ptr-5);
это необязательно, но строки могут располагаться друг за другом и строка "%s\n" потом также расположится после них

второй пример в порядке, потому что там то же самое (строка остаётся доступна), возвращается лишь адрес первого символа

Цитата Сообщение от usernet009
по идее должно выдать ошибку записи в память
если натолкнётся на область, куда не сможет записать
а так, данные, которые за массивом, свободны и могут перезаписаться чем-нибудь
ещё там может быть уже какая-нибудь переменная и её значение затрётся
если у тебя есть строка, у которой меняется длина, юзай strncpy()
1
25 / 25 / 5
Регистрация: 28.12.2009
Сообщений: 85
01.05.2010, 10:26  [ТС] 4
Мм... спасибо Все понял.
Вот только появилось еще 2 вопроса.
1:Массивы тоже имеют статический тип как и строковые литералы ?
Ну тоесть можно ли делать вот так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int *create()
{
    int ptr[4] = {5,4,3,2};
    return ptr;
}
int main(int argc, char *argv[])
{
    int *PTR = create();
    cout<<PTR[0];
    cout<<PTR[1];
    cout<<PTR[2];
    cout<<PTR[3];   
    system("pause");
}
У себя запускал и.... строка cout<<PTR[0]; действительно выводит число 5. А остальные - бред.
2: где можно почитать эти самые "стандарты" С ?
0
4848 / 3269 / 466
Регистрация: 10.12.2008
Сообщений: 10,569
02.05.2010, 08:14 5
Цитата Сообщение от usernet009
1:Массивы тоже имеют статический тип как и строковые литералы ?
если со static его определишь, то он будет сохраняться после функции (его содержимое ничем не перезапишется), а так, считай везде стоит слово auto (существует только в том блоке, где был создан)

Цитата Сообщение от usernet009
2: где можно почитать эти самые "стандарты" С ?
на wiki язык C, там внизу переход на стандарты
два стандарта всего 89 и 99 (черновики, так как реальные платные)
1
25 / 25 / 5
Регистрация: 28.12.2009
Сообщений: 85
02.05.2010, 12:45  [ТС] 6
Спасибо, буду читать
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.05.2010, 12:45

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Несколько вопросов
Делаю небольшую консольную игру для тренировки и есть несколько вопросов. char *lev; //char lev; ...

Несколько вопросов
Всем привет. Только недавно начал работать с виндоуз формами, и сразу появилось несколько вопросов,...

Несколько вопросов.
Уважаемые форумчане! Доброго времени суток) Сегодня у меня появилось несколько вопросов по...

Несколько вопросов
&lt;b&gt;1. &lt;/b&gt;Полностью идентичные сайты склеиваются, как можно управлять склейкой сайтов, тоесть если...


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

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

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