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

char *s или char s[] - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Подскажите книжку по динамическому программированию. http://www.cyberforum.ru/cpp-beginners/thread342825.html
Доброго времени суток! Наткнулся на такое понятие, как динамическое программирование, горю желанием узнать больше. Пожалуйста, подскажите литературу по динамическому программированию, только для...
C++ Конструктор копировщик Самостоятельно изучаю С++ по Либерти(освой за 21 день) Требуется создать класс и конструктор копировщик. Компилятор Visual C++ 2010. Выдает ошибку: 1>c:\users\selver\documents\visual studio... http://www.cyberforum.ru/cpp-beginners/thread342793.html
C++ Создание вложенной папки (Directory)
Добрый день, появилась необходимость создать вложенную папку в среде windows XP нашел тока #include <windows.h> CreateDirectory((LPCTSTR)"c:\\new",NULL); // но данный код не работает почему-то,...
Разложение числа на слагаемые C++
Разложение числа на слагаемые - используется во многих задачах (как мне кажется - это тривиальная задача). И мне стало интересно: какой самый быстрый алгоритм разложения числа на слагаемые вы...
C++ Расчет краски на лабиринт http://www.cyberforum.ru/cpp-beginners/thread342764.html
Условие задачи тут #include <iostream> using namespace std; void paint(int i, int j) { if (a=='.') { a='$'; paint(i+1,j); paint(i-1,j); paint(i,j+1);
C++ Создание нескольких стеков //--------------------------------------------------------------------------- #pragma hdrstop #include <tchar.h> #include <stdlib.h> #include <iostream.h> #include <dos.h>... подробнее

Показать сообщение отдельно
Сыроежка
Заблокирован
17.08.2011, 16:41
Цитата Сообщение от skvor Посмотреть сообщение
C++
1
2
3
4
  char s1[]="1111",s2[]="2222";
  printf("%s %s\n",s1,s2);
  memmove(s1,s2,2);
  printf("%s %s\n",s1,s2);
работает нормально
C++
1
2
3
4
  char *s1="1111",*s2="2222";
  printf("%s %s\n",s1,s2);
  memmove(s1,s2,2);
  printf("%s %s\n",s1,s2);
компилируется с предупреждением

и при запуске падает из-за memmove. Что собственно в этом плохого?
Во-втором случае вы инициализируете указатель значением, который указывает на строковый литерал. Согласно стандарту С++ строковый литерал имеет тип const char[], то есть массив констатных символов. Стандарт оставляет способ размещения литералов на усмотрение производлителей компиляторов. Например, совпадающие по значению литералы, то есть дублирующиеся литералы могут храниться в виде одного литерала. В свыязи с этим представьте себе такой код

C++
1
2
3
4
5
6
7
char *p = "Lex";
 
*p = 'S";
...
...
if ( strcmp( s, "Lex" ) == 0 )
/* и.т.д. */
Вы думаете, что с помощью функции strcmp вы сравниваете символьный массив 's' со значением "Lex", а на самом деле так как компилятор совпадающие строковые литералы может хранить в виде одного строкового литерала, то вы будете сравнивать не с "Lex", а с "Sex", так как строковый литерал был изменен!

Во-вторых, компилятор может размещать строковые литералы в памяти, предназначенной только для чтения. И тогда, как в вашем случае, произойдет аварийное завершении программы при попытки изменить строковый литерал.

В первом же случае, когда вы объявляете массив, то нимкакого строкового литерала в памяти не создается. Создается массив, который инициализируется значением выражениям инициализации. То есть в данном случае

char s1[]="1111";

создается массив s1, элементы которого получают значения '1', '1', '1', '1', '\0'. А сам строковый литерал, используемый в качестве выражения инициализации в памяти программы не сохраняется.
0
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru