Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

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

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

Купить рекламу на форуме - 42 тыс руб за месяц

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

я вот таким кодом проверял 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 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


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