Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > C++ > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail


Донат для форума - использовать для поднятия настроения себе и модераторам

А ещё здесь можно купить рекламу за 25 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru

Ответ
 
Опции темы
Старый 28.06.2017, 06:47   #151
alexzk
Участник клуба
 
Регистрация: 12.04.2017
Сообщений: 889
Репутация: 172
По умолчанию

Цитата:
Сообщение от bugaboo Посмотреть сообщение
а я думал просто типа "неявное приведение типа"...
А как правильно заполнять динамический массив при помощи строкового литерала?
все тот же strcpy:

strcpy(arr, "SOME_STRING");
alexzk вне форума   Ответить с цитированием
Старый 28.06.2017, 06:48   #152
bugaboo
Форумчанин
 
Регистрация: 18.06.2017
Сообщений: 55
Репутация: 10
По умолчанию

Это я к вопросу о
Цитата:
Сообщение от alexzk Посмотреть сообщение
Код:

const char* b = new char[la + 1];
b = "BLABLA";

...распределили память! потеряли эту память, заменив указатель на "BLABLA";
bugaboo вне форума   Ответить с цитированием
Старый 28.06.2017, 06:50   #153
alexzk
Участник клуба
 
Регистрация: 12.04.2017
Сообщений: 889
Репутация: 172
По умолчанию

там вообще можно было сразу литерал использовать, без масива. Функции strcpy фиолетова, какой источник, а вот приемник - массив обязательно (если приемник-литерал - все упадет, хотя, с правильным компилером, просто не должно компилится).
alexzk вне форума   Ответить с цитированием
Старый 28.06.2017, 06:57   #154
bugaboo
Форумчанин
 
Регистрация: 18.06.2017
Сообщений: 55
Репутация: 10
По умолчанию

Цитата:
Сообщение от alexzk Посмотреть сообщение
все тот же strcpy:

strcpy(arr, "SOME_STRING");
а в случае со статическим массивом, например,
Код:
char* a = "blabla";
char* b = "BLABLA";
a = b;
Это криво, или нормально? Что после этого будет с "blabla"?
bugaboo вне форума   Ответить с цитированием
Старый 28.06.2017, 07:02   #155
alexzk
Участник клуба
 
Регистрация: 12.04.2017
Сообщений: 889
Репутация: 172
По умолчанию

Цитата:
Сообщение от bugaboo Посмотреть сообщение
а в случае со статическим массивом, например,
Код:
char* a = "blabla";
char* b = "BLABLA";
a = b;
Это криво, или нормально? Что после этого будет с "blabla"?
потеряете к нему доступ и все...а так это литерал, часть кода. Его удалять не нада. ...ну и криво, да. Не по стандарту. Не всякий компилер такое съест.
alexzk вне форума   Ответить с цитированием
Старый 28.06.2017, 07:05   #156
alexzk
Участник клуба
 
Регистрация: 12.04.2017
Сообщений: 889
Репутация: 172
По умолчанию

А насчет биг-эндиан....

Код:
union some_t
{
     uint32_t number;
     unsigned char bytes[4];
};
При доступе к полю number будете читать - писать число на любой архитектуре одинакова.
А вот при доступе к bytes будет разный порядок для одинакового number.
alexzk вне форума   Ответить с цитированием
Старый 28.06.2017, 07:08   #157
Croessmah
Вредный кошак
Профессионал
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Сообщений: 1,159
Репутация: 379
По умолчанию

Такое использование union (запись в одно поле, а чтение из другого) в c++ приводит к неопределенному поведению.
Croessmah вне форума   Ответить с цитированием
Старый 28.06.2017, 07:21   #158
bugaboo
Форумчанин
 
Регистрация: 18.06.2017
Сообщений: 55
Репутация: 10
По умолчанию

Цитата:
Сообщение от alexzk Посмотреть сообщение
потеряете к нему доступ и все...
Значит, "правильнее" всё-таки писать типа такого?
Код:
	char a[7];
	strcpy(a, "blabla");
	const char* b = "BLABLA";
	strcpy(a, b);
bugaboo вне форума   Ответить с цитированием
Старый 28.06.2017, 07:25   #159
Croessmah
Вредный кошак
Профессионал
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Сообщений: 1,159
Репутация: 379
По умолчанию

Массивы можно инициализировать напрямую:
Код:
char a[] = "blabla";
Croessmah вне форума   Ответить с цитированием
Старый 28.06.2017, 07:34   #160
bugaboo
Форумчанин
 
Регистрация: 18.06.2017
Сообщений: 55
Репутация: 10
По умолчанию

я вот таким кодом проверял endian на спарке
Код:
#include <iostream>
using namespace std;
int main()
{
	union f
	{
		int i;
		char c[sizeof(int)];
	};
	f foo;
	foo.i = 1;
	if (foo.c[0] == 1)
	{
		cout << "Little endian" << endl;
	}
	else
	{
		cout << "Big endian" << endl;
	}
	system("pause");
	return 0;
}
Так пишет "Little endian", а на спарке - "Big endian".

Цитата:
Сообщение от Croessmah Посмотреть сообщение
Массивы можно инициализировать напрямую:
Код:
char a[] = "blabla";
это да, но чтобы "blabla" не висело где-то в памяти никому не нужное - это всё то же strcpy?
Можно ли как-то сделать, чтобы компилятор не ругался именно на эти 2 замечательные функции (strcpy и strcat), а на остальное - пусть пока ругается?
bugaboo вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
MMX сложить два числа gansm Assembler 13 29.10.2010 05:16
как сложить два числа с плавающей точкой forsy Assembler 19 29.03.2010 02:15
Макрос: сложить два числа белочка Microsoft Office Excel 6 23.12.2009 23:02
Сложить два числа и вывести результат на экран We1c0m3 Assembler 2 23.05.2009 11:41
Сложить два числа iwaniwan Win Api 3 23.04.2009 06:27


09:20.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.