17 / 5 / 0
Регистрация: 16.04.2016
Сообщений: 344

Что правильнее передавать в функцию,ожидающую char*

16.03.2023, 13:48. Показов 1211. Ответов 33
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всех приветствую. Есть функция,которая ожидает на входе увидеть char*,чтобы наполнить его данными. Как правильно передать туда этот массив,т.к компилятор не ругается не в первом,не во втором случае. Но как это будет правильнее с точки зрения экономии памяти и почему. Первый вариант:
C++
1
2
char data[MAX_PATH];
fullData(data);
Второй вариант:
C++
1
2
char data[MAX_PATH];
fullData(&data);
Может оба варианта правильны,т.е автоматически происходит приведение к указателю?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.03.2023, 13:48
Ответы с готовыми решениями:

Как правильно передавать char* в функцию?
Добрый всем! Есть две функции. Они должны выполнять одну и ту же вещь, только в одной хотел сделал через char* в стиле Си, в другой - c...

Что значит Handle hf? Что в эту функцию нужно передавать
мне нужно создать функцию Node * ReadNode(HANDLE hf); (Node это структура) Так вот вопрос в том что значит Handle hf? Что в эту функцию...

Посоветуйте библиотечную функцию ввода, не ожидающую нажатия Enter
Подскажите пожалуйста, как можно сделать такой ввод, чтобы цикл не вставал в ожидании нажатия клавиши, а лишь рассматривал, был ли ввод на...

33
17 / 5 / 0
Регистрация: 16.04.2016
Сообщений: 344
16.03.2023, 21:27  [ТС]
Студворк — интернет-сервис помощи студентам
Да,warning есть,но error нету.
1
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,312
16.03.2023, 21:52
Цитата Сообщение от КАВ Посмотреть сообщение
,warning есть,но error нету.
И что? В языках С и С++ нет таких понятий как "warning" или "error".

Алгоритм здесь прост:

Компилятор выдал вам диагностическое сообщение? Да, выдал.
Это диагностическое сообщение требуется стандартом языка? Да, это constraint violation, то есть диагностическое сообщение требуется.
Значит всё: код НЕ компилируется.

А "warning" у вас там или "error" написано - это не имеет никакого значения. Это лишь частные особенности диагностики в вашем компиляторе.

---

Это во-первых. А во-вторых, наличие этого "warning" разве не дало вам однозначный ответ на ваш исходный вопрос? Почему вопрос "как правильно" все равно возник?
0
И тут вот те нате
322 / 209 / 117
Регистрация: 12.07.2016
Сообщений: 555
16.03.2023, 23:09
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Получаем диагностику
Хорошая информативность, это clang?
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,312
16.03.2023, 23:24
Цитата Сообщение от Evgen173 Посмотреть сообщение
это clang?
Нет, почему clang? Это штатная конфигурация.
0
И тут вот те нате
322 / 209 / 117
Регистрация: 12.07.2016
Сообщений: 555
16.03.2023, 23:55
TheCalligrapher, понял, показалось
0
Отпрыск ChatGPT
 Аватар для Azawa
266 / 31 / 4
Регистрация: 18.06.2019
Сообщений: 155
17.03.2023, 00:03
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
требуется стандартом языка
Где требуется стандарт языка?
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,312
17.03.2023, 00:23
Цитата Сообщение от Azawa Посмотреть сообщение
Где требуется стандарт языка?
Не "требуется стандарт", а требуется стандартом.

Constraints раздела "6.5.2.2 Function calls" говорят, что для функций, объявленных с прототипом, проверка соответствия типов аргументов типам параметров делается по правилам присваивания.

Constraints раздела "6.5.16.1 Simple assignment" говорят

One of the following shall hold:
  • the left operand has atomic, qualified, or unqualified arithmetic type, and the right has arithmetic type;
  • the left operand has an atomic, qualified, or unqualified version of a structure or union type compatible with the type of the right;
  • the left operand has atomic, qualified, or unqualified pointer type, and (considering the type the left operand would have after lvalue conversion) both operands are pointers to qualified or unqualified versions of compatible types, and the type pointed to by the left has all the qualifiers of the type pointed to by the right;
  • the left operand has atomic, qualified, or unqualified pointer type, and (considering the type the left operand would have after lvalue conversion) one operand is a pointer to an object type, and the other is a pointer to a qualified or unqualified version of void, and the type pointed to by the left has all the qualifiers of the type pointed to by the right;
  • the left operand is an atomic, qualified, or unqualified pointer, and the right is a null pointer constant; or
  • the left operand has type atomic, qualified, or unqualified _Bool, and the right is a pointer.
Какие типы в С являются "compatible" я тут разворачивать не буду, а лишь сообщу, что типы char и char [100] не являются compatible.

В данном случае типы операндов не удовлетворяют ни одному из этих пунктов. Constaints присваивания нарушены. Поэтому требуется диагностическое сообщение.

Другим словами такой вызов функции в С не допускается по той же причине, по которой не допускается присваивание

C
1
2
3
char a[100];
char *p;
p = &a; // <-- constraint violation
1
Отпрыск ChatGPT
 Аватар для Azawa
266 / 31 / 4
Регистрация: 18.06.2019
Сообщений: 155
17.03.2023, 01:08
TheCalligrapher, ааа… Так брать адрес уже адреса на начало массива и присваивать его в char * уже бессмыслица какая-то. Всё, понял о чём речь. Такое недопустимо без явного каста.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,312
17.03.2023, 01:12
Цитата Сообщение от Azawa Посмотреть сообщение
Так брать адрес уже адреса на начало массива
"адрес уже адреса"??? &a - это никакой не "адрес уже адреса". С чего бы это вдруг? &a - это просто адрес всего массива.

Между p = a и p = &a нет никакой физической разницы. Но второй вариант нарушает формальные правила типизации языка.
0
Отпрыск ChatGPT
 Аватар для Azawa
266 / 31 / 4
Регистрация: 18.06.2019
Сообщений: 155
17.03.2023, 01:55
TheCalligrapher, ну тк a это адрес на начало массива, который здесь же. (void*)a == (void*)&a[0] Если сделаем *a получим первый элемент. Если делаем &a, чего мы хотим добиться оператором взятия адреса массива и присваивания его в char*? char * = char(*)[]? Это просто не логично, поэтому правильно, что есть такие формальные правила типизации.
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
17.03.2023, 02:19
Цитата Сообщение от Azawa Посмотреть сообщение
char(*)[]
Размер массива - является частью типа.
Так что это какие-то дымчатые круги.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,312
17.03.2023, 02:46
Цитата Сообщение от Azawa Посмотреть сообщение
ну тк a это адрес на начало массива,
Нет, a - это сам массив. Объект типа char [100] в памяти. Блок памяти размеров в 100 байт.

Цитата Сообщение от Azawa Посмотреть сообщение
(void*)a == (void*)&a[0] Если сделаем *a получим первый элемент.
Это все проявления автоматического "array to pointer conversion", которое в таком случае насильно применяется языком к массиву почти всегда.

Цитата Сообщение от Azawa Посмотреть сообщение
Если делаем &a, чего мы хотим добиться оператором взятия адреса массива и присваивания его в char*?
Но оператор & является исключением. В случае &a "array to pointer conversion" НЕ применяется. Поэтому в &a нет никакого "адреса уже адреса".

"Array to pointer conversion" дает указатель на нулевой элемент массива. А &a дает указатель на начало всего массива целиком. Эти адреса численно, разумеется, совпадают, т.е. соответствуют одной и той же точке в памяти.

Они различаются лишь типами. "Array to pointer conversion" дает char * (как и &a[0]), то есть указатель на элемент массива. А &a дает char (*)[100], то есть указатель на весь массив.

Цитата Сообщение от Azawa Посмотреть сообщение
Это просто не логично
С "физической" точки зрения это "логично", то есть p = a и p = (char *) &a делают одно и то же. Но смысла в таком подавлении типизации нет. Зачем?

См. также Распространенные ошибки
0
 Аватар для abit
870 / 529 / 149
Регистрация: 03.02.2013
Сообщений: 1,882
17.03.2023, 03:13
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
то есть p = a и p = (char *) &a делают одно и то же.
точно одно и то же?
C++
1
2
3
4
5
6
7
8
9
10
11
12
 
  char *a, *b, *c;
 
  a = new char[1];
  a[0] = 11;
 
  b = a;
  c = (char *) &a;
  
  std::cout <<(int)a[0] << std::endl;
  std::cout <<(int)b[0] << std::endl;
  std::cout <<(int)c[0];
Вывод:
11
11
-16
очевидно имелось в виду p = (char *) &a[0];
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,312
17.03.2023, 05:13
Цитата Сообщение от abit Посмотреть сообщение
точно одно и то же?
Да, точно.

Цитата Сообщение от abit Посмотреть сообщение
char *a, *b, *c;
a = new char[1];
Что это и к чему это здесь? Здесь речь идет о применении & к массиву, а не к указателю. То есть о char a[100].

Ваш пример с char *a к рассматриваемой теме никакого отношения даже отдаленно не имеет. К чему это здесь?

Цитата Сообщение от abit Посмотреть сообщение
очевидно имелось в виду p = (char *) &a[0];
Нет, имелось в виду именно p = (char *) &a;

---

C
1
2
3
4
5
6
7
8
9
#include <stdio.h>
 
int main(void)
{
  char a[100];
  char *p1 = a;
  char *p2 = (char *) &a;
  printf("%p %p\n", p1, p2);
}
Code
1
0x7ffc9efbc510 0x7ffc9efbc510
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
17.03.2023, 05:13

Как правильнее вызывать метод(стоит ли указывать, каким параметрам передавать значения)?
@staticmethod def _create_table( columns: str, primary_key: str, ...

Что лучше передавать из функции в функцию — массив переменных или переменные по одной?
Что лучше передавать из функции в функцию - массив переменных или переменные по одной?

Как сделать что бы в функцию передавать массив и исправить ошибки(недопустимый неполный тип)?
#include &lt;iostream&gt; using namespace std; class Bus { public: string famelia, inichialu; int number_bus, number_marchryt; ...

Как правильнее проинициализировать char's, чтобы не было мусора?
struct ElementOfTree { char value; ElementOfTree *parent; ElementOfTree *left; ElementOfTree *right; }; struct Tree ...

Как передавать указатель на функцию в функцию для ее выполнения?
Здравствуйте! Вопрос следующий: Как передавать указатель на функцию в функцию для ее выполнения? Например: &lt;хедер&gt; ... ...


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

Или воспользуйтесь поиском по форуму:
34
Ответ Создать тему
Опции темы

Новые блоги и статьи
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
Почему SEO не начинается с ключевых слов: что проверить до написания текстов
Neotwalker 01.08.2026
Когда владельцу сайта предлагают заняться SEO, первым шагом часто становится сбор запросов и написание текстов. Логика кажется понятной: 1. Находим ключевые слова. 2. Добавляем их на. . .
Знание — сила: Доктрина интенциональности знаний, углубление в формулу
Hrethgir 01.08.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11957&stc=1&d=1785567302 Знаменитый афоризм Фрэнсиса Бэкона «Знание — сила» (Scientia potentia est) в массовой культуре принято понимать. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru