Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
17 / 5 / 0
Регистрация: 16.04.2016
Сообщений: 344

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

16.03.2023, 13:48. Показов 1200. Ответов 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
13207 / 6841 / 1823
Регистрация: 18.10.2014
Сообщений: 17,304
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
13207 / 6841 / 1823
Регистрация: 18.10.2014
Сообщений: 17,304
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
13207 / 6841 / 1823
Регистрация: 18.10.2014
Сообщений: 17,304
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
13207 / 6841 / 1823
Регистрация: 18.10.2014
Сообщений: 17,304
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
13207 / 6841 / 1823
Регистрация: 18.10.2014
Сообщений: 17,304
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,858
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
13207 / 6841 / 1823
Регистрация: 18.10.2014
Сообщений: 17,304
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
Ответ Создать тему
Новые блоги и статьи
Remote Connection Manager
DevAlt 21.06.2026
Написал для себя небольшую прилагу: https:/ / github. com/ altbodhi/ ReConMan По итогу пришел к мысли, что DU не дружат с существующими технологиями. От сериализации до отображения в реляционную. . .
Администрация Хабра удаляет новые энрегоэфективные алгоритмы, которые не западной школы кода, и вовсе никак не сгенерировавны.
Hrethgir 20.06.2026
Делается это, как замечено, при правках - при объявлении концептуальных отличий в алгоримах. Делается это, по линейке событий - после дополнения публикации основными отличиями от основных западных. . .
Процесс ориентированная диалектика (не новость - просто системное обновление, философия).
Hrethgir 20.06.2026
Однажды один участник в своём блоге, на этом форуме, сделал запись "О языках замолвите слово". Понимая, что язык - важная вещь, я решил хорошо подумать, прежде чем сказать, и сказал то, что вы видите. . .
Контроль уникальности строк в табличной части документа
Maks 18.06.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ПланированиеСпецтехники" с табличной частью "НаличиеОборудования", разработанного в КА2. Задача: контроль уникальности строк в. . .
Клиент
Uhbif79 18.06.2026
Здесь простой клиент для работы с сервером.
Сервер
Uhbif79 18.06.2026
Выкладываю простейший сервер.
Дефенестрация
kumehtar 18.06.2026
Узнал интересное слово. Дефенестрация. Это когда ты выбрасываешь кого-либо или что-либо из окна. Возьму на вооружение)))
Дихотомия добра и зла
kumehtar 18.06.2026
Как Дзен-буддисты говорят о добре и зле: не нужно воевать против зла, нужно воевать против невежества. Тогда добро станет ествественным, и поэтому вечным. Но дело в том, что невежество всё время. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru