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

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

Войти
Регистрация
Восстановить пароль
 
usernet009
24 / 24 / 1
Регистрация: 28.12.2009
Сообщений: 85
#1

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

30.04.2010, 23:49. Просмотров 435. Ответов 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");
по идее должно выдать ошибку записи в память, но нифига не выдает. Почему ?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.04.2010, 23:49     Несколько вопросов по строкам в С
Посмотрите здесь:

Несколько вопросов - C++
Добрый день. Начал писать одну программу в VS 2008 C++ (консоль) и столкнулся в несколькими проблемами. В общем желательно нужно, чтобы...

Несколько вопросов - C++
Здравствуйте. Возникло несколько вопросов: 1. Когда нажимаешь на определённую клавишу происходит определённое действие (типа меню)...Я на...

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

Несколько вопросов по извучению C++ - C++
Добрый день, товарищи!! Я немного новичек в вопросах программирования на C++, поэтому прошу строго не судить меня за мои, возможно,...

Несколько вопросов к программистам. - C++
Доброго времени суток! я начинающий, последние пару месяцев делал упор на изучение Си, WinAPI и дискретной математики. Наверное, это было...

Несколько вопросов по указателям. - C++
Добрый день. Не получается до конца разобраться с указателями, потому есть несколько вопросов. Кому несложно, помогите, пожалуйста. 1....

Несколько вопросов по основам программирования - C++
Вот дали вопросы по С++ ,но точного ответа так и не нашел!! Может вы чем то поможете или дадите сылочку на них!! Вот сами вопросы!! ...

Несколько простых вопросов от начинающего - C++
Здравствуйте! Мне интересны следующие вопросы: 1. Где лучше объявить переменные нужные на протяжении всей работы программы? Например...

Графический редактор. Несколько вопросов - C++
Здравствуйте! Нам в вузе преподаватель дал мне курсовую графический редактор (GIF). На любом языке. Я пока думаю между C++ и Delphi. Но...

Несколько вопросов про массив - C++
Добрый день, было задание написать программку, которая бы подсчитывала количество элементов в массиве, меньших значений C, которое вводится...

Шаблоны классов: контейнер. Несколько вопросов - C++
Задача: постоить класс контейнера, параметризовать его, создать вектор с заданным вручную типом. Определил произвольный класс для...

Сортировка по алфавиту и еще несколько вопросов по С++ - C++
Срочно нужна помощь. 1) Нужно отсортировать по алфавиту массив из n элементов класса string. 2) Как вывести число с определенным...


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
rangerx
1932 / 1541 / 141
Регистрация: 31.05.2009
Сообщений: 2,909
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++ нет контроля выхода за пределы массива. Поэтому вы вполне можете затереть какой-нибудь соседний массив таким образом. В общем, так лучше не делать
accept
4820 / 3240 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
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()
usernet009
24 / 24 / 1
Регистрация: 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: где можно почитать эти самые "стандарты" С ?
accept
4820 / 3240 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
02.05.2010, 08:14     Несколько вопросов по строкам в С #5
Цитата Сообщение от usernet009
1:Массивы тоже имеют статический тип как и строковые литералы ?
если со static его определишь, то он будет сохраняться после функции (его содержимое ничем не перезапишется), а так, считай везде стоит слово auto (существует только в том блоке, где был создан)

Цитата Сообщение от usernet009
2: где можно почитать эти самые "стандарты" С ?
на wiki язык C, там внизу переход на стандарты
два стандарта всего 89 и 99 (черновики, так как реальные платные)
usernet009
24 / 24 / 1
Регистрация: 28.12.2009
Сообщений: 85
02.05.2010, 12:45  [ТС]     Несколько вопросов по строкам в С #6
Спасибо, буду читать
Yandex
Объявления
02.05.2010, 12:45     Несколько вопросов по строкам в С
Ответ Создать тему
Опции темы

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