Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.54/107: Рейтинг темы: голосов - 107, средняя оценка - 4.54
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
1

В чем разница между char* и char[]?

01.10.2014, 18:28. Показов 21141. Ответов 69
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток, наткнулся на одну загвоздку есть такой кусок кода
C++
1
2
3
4
5
6
7
8
int _tmain(int argc, _TCHAR* argv[])
{
    char *a = "111111111111";
    *((int*)a+1) = 0;
    std::cout<<a;
    system("pause");
    return 0;
}
и такой
C++
1
2
3
4
5
6
7
8
int _tmain(int argc, _TCHAR* argv[])
{
    char a[] = "111111111111";
    *((int*)a+1) = 0;
    std::cout<<a;
    system("pause");
    return 0;
}
запускаем в виже, первый кусок эксепшн
второй норм. Разъясните пожалуйста
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.10.2014, 18:28
Ответы с готовыми решениями:

В чем разница между char* и char **
в чем разница между char* и char ** ??

Разница между char и signed char
Не понимаю в чем разница между char и signed char, ведь char по умолчанию знаковый. Не...

Разница между char[] и char*
Здравствуйте. Провожу небольшую иследовательскую работу по выяснении разницы между char и char*....

Разница между new char[] и new char[]()
Доброго времени суток. Подскажите пожалуйста разницу, между следующим кодом: char* ch = new...

69
18848 / 9847 / 2408
Регистрация: 30.01.2014
Сообщений: 17,290
03.10.2014, 19:09 61
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от Dani Посмотреть сообщение
МИНИМУМ 8 бит
Про биты в стандарте нет ничего конкретного. Стандарт гарантирует ,что sizeof(char) == 1 (байт) и все. Вышеприведенные неравенства этому не противоречат. А байт гипотетически может быть какой угодно разрядности, не обязательно 8 бит (например запросто может быть 7 бит, и даже 6 бит). Модель типов С и С++ запросто ложится на машины с такой разрядностью байта.

Добавлено через 2 минуты
Цитата Сообщение от Dani Посмотреть сообщение
int - минимум 16, long - минимум 32.
Это тоже неверно. Посмотри на неравенство, которое ты привел. Ситуация, когда sizeof(char) == sizeof(long) вполне реальна.
0
1405 / 647 / 135
Регистрация: 11.08.2011
Сообщений: 2,299
Записей в блоге: 2
03.10.2014, 19:23 62
DrOffset, написал как прочел: Страуструп "Язык программирования С++". Глава 4.1
1
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
03.10.2014, 19:30 63
выдержка из стандарта раз
выдержка из стандарта два

Добавлено через 2 минуты
Цитата Сообщение от DrOffset Посмотреть сообщение
Ситуация, когда sizeof(char) == sizeof(long) вполне реальна
Исходя из написанного выше - нет. Правда опять ломает во всё это вникать, в каком стандарте чего появилось, но в современных стандартах таких случаев уже не положено
2
18848 / 9847 / 2408
Регистрация: 30.01.2014
Сообщений: 17,290
03.10.2014, 19:53 64
Цитата Сообщение от Dani Посмотреть сообщение
написал как прочел: Страуструп "Язык программирования С++". Глава 4.1
К сожалению эта информация расходится с тем, что написано в стандарте.
В третьем издании действительно написано именно это. Рискну предположить, что для простоты изложения.
К слову, в четвертом издании (которое на русском еще не издавалось) этот параграф переработан и эти спорные утверждения убраны (все, кроме утверждения о восьмибитности char, в самом же стандарте про это нет ни слова).
Можешь сам почитать, если сомневаешься, параграф: 3.9.1 Fundamental types.

Добавлено через 10 минут
Цитата Сообщение от Evg Посмотреть сообщение
Исходя из написанного выше - нет.
Хорошо. Согласен, я не прав.
Жаль только это расходится с практикой. Получается, что компилятор С для машины с семибитным байтом не может существовать в принципе.
0
1405 / 647 / 135
Регистрация: 11.08.2011
Сообщений: 2,299
Записей в блоге: 2
03.10.2014, 20:02 65
DrOffset, я нашел это в 4том издании - 6.2.8 Sizes
0
18848 / 9847 / 2408
Регистрация: 30.01.2014
Сообщений: 17,290
03.10.2014, 20:53 66
В свою защиту могу сказать, что стандарт С++ действительно нигде не упоминает соответствующие ограничения прямым текстом. Есть только сноска на стандарт С.
2 The contents are the same as the Standard C library header <limits.h>.
Вот так, век живи, век учись.

Добавлено через 2 минуты
Цитата Сообщение от Dani Посмотреть сообщение
DrOffset, я нашел это в 4том издании - 6.2.8 Sizes
Да спасибо. Это теперь уже не важно. Стандарт С, оказывается все разъясняет, а С++ просто на него ссылается, поэтому там и нет этой информации прямым текстом.

Добавлено через 40 минут
Цитата Сообщение от Evg Посмотреть сообщение
Цитата Сообщение от DrOffset Посмотреть сообщение
Ситуация, когда sizeof(char) == sizeof(long)
Исходя из написанного выше - нет.
С учетом того, что я был не прав насчет минимального порога, то насчет максимального порога все стыкуется.
Т.е. ситуация, когда sizeof(char) == sizeof(int) действительно вполне реальна и не противоречит ничему вышесказанному, в случае, когда sizeof(char) == 4 или 8. Как пример можно привести множество современных DSP, например Texas Instruments DSP TMS32F28xx, где CHAR_BIT=16.
1
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
03.10.2014, 21:05 67
Цитата Сообщение от DrOffset Посмотреть сообщение
Стандарт С, оказывается все разъясняет, а С++ просто на него ссылается
Вот так и рушится концепция реальности, если до самого низу все ссылки не проштудируешь.
Цитата Сообщение от DrOffset Посмотреть сообщение
в случае, когда sizeof(char) == 4 или 8.
Что-а? А как же 5.3.3/1
sizeof(char), sizeof(signed char) and sizeof(unsigned char) are 1.
1
18848 / 9847 / 2408
Регистрация: 30.01.2014
Сообщений: 17,290
03.10.2014, 21:19 68
Цитата Сообщение от Tulosba Посмотреть сообщение
Что-а? А как же 5.3.3/1
Я некорректно выразился.
Имел в виду CHAR_BIT=16 и CHAR_BIT=32.
sizeof(char) конечно же всегда равен 1, разрядность самого char при этом может быть больше восьми бит.

Я поздно заметил ошибку, исправить уже не смог
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
03.10.2014, 23:53 69
Цитата Сообщение от DrOffset Посмотреть сообщение
Т.е. ситуация, когда sizeof(char) == sizeof(int) действительно вполне реальна и не противоречит ничему вышесказанному
Да. Просто в очередной раз запутался в идиотской формулировке о минимально размере максимальной величины. Для DSP делают, например, 32-битный char, а типы short, int, long совпадают с char'ом. У у всех sizeof == 1

Цитата Сообщение от DrOffset Посмотреть сообщение
Получается, что компилятор С для машины с семибитным байтом не может существовать в принципе
Думаю, что может. А пользователям такой машины будет пофиг, что компилятор не совсем по стандарту работает
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
04.10.2014, 09:31 70
Цитата Сообщение от Dani Посмотреть сообщение
Кроме того, гарантируется что под char будет выделено МИНИМУМ 8 бит, int - минимум 16, long - минимум 32.
Кем гарантировано?
Здесь приведён список микропроцессоров фирмы Intel, начиная с первого 4-битного 4004 (1971), до самых последних моделей — 64-битных Itanium 2 (2002) и Intel Core (2008)[1]. Приведены технические данные для каждого микропроцессора[2].
. Доказательства, что такая шина может юзаться только для последовательной пересылки пар полубайтов, а создать процессор с четырёхбитным байтом невозможно будут? Или голословное утверждение?

Добавлено через 19 минут
Цитата Сообщение от DrOffset Посмотреть сообщение
Про биты в стандарте нет ничего конкретного. Стандарт гарантирует ,что sizeof(char) == 1 (байт) и все. Вышеприведенные неравенства этому не противоречат. А байт гипотетически может быть какой угодно разрядности, не обязательно 8 бит
96-ти битный байт его утверждению тоже не противоречит. Главное слово у него - "минимум". Но и это не верно. ASCII - это вообщето 7-ми битная кодировка, а не 8-ми. И то, что ни кто не стал делать байт, разрядность которого не равна целой степени двойки, ничего не гарантирует. Трайт на сетуне 6 трит вместо девяти, так что в принципе могли сделать и 7. И ни 48, ни 96 бит - тоже нифига не целые степени двойки. Пришли к степеням двойки, а 7 так и не сделали? Эйси. 4 - тоже целая степень двойки и четырёхбитные шины реально существовали. Да, тот процессор байты всё таки имел по 8 бит штука, а по шине гонял пары полубайт. А кто сказал, что нельзя сделать по другому? Символы можно кодировать и несколькими байтами. Например, двумя. Да и снова отойти от степеней двойки для какой нибудь экзотической, не нуждающейся в совместимости платформы тоже можно. Семи бит для символа достаточно. А если ещё и с алфавитом не надо работать, если достаточно цифр, точки, пробела и арифметических знаков, то и четырёх хватит: 10 цифр + 1 пробел + 4 знака операций + 1 точка = 16, https://www.cyberforum.ru/cgi-bin/latex.cgi?2^4=16. Вопрос целесообразности роняет лишь вероятность подобных вроде бы глупостей, но ни как не гарантирует от таких байтов. Особенно если учесть зоопарк эмуляторов и виртуальных машин, для которых тоже можно делать кроскомпиляторы c/c++.

Добавлено через 16 минут
Да, кстати, существует целый форум энтузиастов, пытающихся снова создать троичный комп, так там ни битов, ни байтов не будет. А с какого перепегу там будут запрещены c/c++?
0
04.10.2014, 09:31
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.10.2014, 09:31
Помогаю со студенческими работами здесь

(char)xx и '\xx' - в чём разница?
День добрый. Просто любопытно, почему cout &lt;&lt; (char)число; и cout &lt;&lt; '\число'; часто дают...

Разница между char и int
Известно что для чар выделяется 1 байт (8 бит) для инт 4 байта (32 бита). Так почему нельзя в чар...

Строка: чем отличается строки string, char, char*?
Помогите разобраться,совсем плохо идёт,чем отличается строки string,char,char* И если можно пару...

Чем отличается const char* от char*?
Доброго всем дня! Из матчасти я понимаю, что char* - это указатель массив символов, тогда как...


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

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