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

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 2010\projects\bufer\bufer\hgfh.cpp(42): error C2662: 'SimpleCircle::GetRadius' : cannot convert 'this' pointer from 'const SimpleCircle' to 'SimpleCircle &' Хотя в книге написано что должно работать.... http://www.cyberforum.ru/cpp-beginners/thread342793.html
C++ Создание вложенной папки (Directory)
Добрый день, появилась необходимость создать вложенную папку в среде windows XP нашел тока #include <windows.h> CreateDirectory((LPCTSTR)"c:\\new",NULL); // но данный код не работает почему-то, к тому же я так понял проблема с преоразованием в LPCTSTR из char* или string у меня есть путь в переменной std::string path = "C:\\test\01\01"; , приэтом папки C:\\test еще нету, необходимо...
Разложение числа на слагаемые C++
Разложение числа на слагаемые - используется во многих задачах (как мне кажется - это тривиальная задача). И мне стало интересно: какой самый быстрый алгоритм разложения числа на слагаемые вы предложите? Думаю, максимальный тест n<=50. З.Ы. Проверю на время сам. И разложения должны быть без повторений (перестановка слагаемых не дает новых разложений) и чтоб строка слагаемых выводилась в файл...
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> //--------------------------------------------------------------------------- namespace Stack подробнее

Показать сообщение отдельно
Сыроежка
Заблокирован
17.08.2011, 16:41     char *s или char s[]
Цитата Сообщение от 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'. А сам строковый литерал, используемый в качестве выражения инициализации в памяти программы не сохраняется.
 
Текущее время: 01:47. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru