Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.94/18: Рейтинг темы: голосов - 18, средняя оценка - 4.94
Evg
Эксперт CАвтор FAQ
19619 / 7311 / 551
Регистрация: 30.03.2009
Сообщений: 20,452
Записей в блоге: 30
1

Указатель на структуру - что напечатает программа

28.11.2011, 18:23. Просмотров 3405. Ответов 42

Возьмём пример на языке Си:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
 
typedef struct
{
  int x, y;
} MyStruct;
 
int main (void)
{
  struct MyStruct *p;
 
  p = NULL;
  printf ("%p\n", p);
/*
  p++;
  printf ("%p\n", p);
*/
  return 0;
}
1. Что напечатается?
2. Что будет, если раскомментировать закомментированный код?
3. Что будет, если данный тест подать в компилятор Си++?

Традиционная просьба к тем, кто заранее знает ответ, прятать его под CUT

UPD: подправлен пример
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.11.2011, 18:23
Ответы с готовыми решениями:

Определить, что напечатает программа
Уважаемые гении, я буду предельно счастлив, если вы поможете мне с этим...

Что напечатает на экране следующая программа?
void main() { int x; clrscr(); x=2*2&lt;&lt;2-1&amp;1; ...

Указатель на структуру
Добрый день! Делаю двусвязный список. В программе хочу сделать функцию...

Указатель на структуру
*uip_buf; #define BUF ((struct uip_eth_hdr *)uip_buf) ...

Указатель на структуру в структуре
Здравствуйте! Изучаю в Си структуры и возник вопрос, что означает последнее...

42
Сыроежка
Заблокирован
28.11.2011, 18:37 2
Совершенно не понятно, чего вы хотите добиться?! Я не проверял, так как не вижу никакого глубокого смысла в этом примере, но скорей всего должен распечаться 0. Если вы раскамментируете предложение, то скорей всего напечатается значение, равное размеру структуры, то есть на 32-битовой платформе это будет значение 8.

Что касается "подать текст в С++", то вам надо изменить имя заголовочного файла с <stdio.h> на <cstdio>, изменить объявление функции main с int main( void ) на int main(), и использовать префикс пространства имен.

Вполне возможно (так как я не проверял и это абсолютно не имеет никакого значения), что в первом обращении к printf будет выведено слово NULL. Но это надо смотреть описание параметра формата p, что он делает для нулевых значений указателя.

То есть ваш пример никакой познавательной ценности не имеет!
0
go
Эксперт С++
3637 / 1369 / 243
Регистрация: 16.04.2009
Сообщений: 4,527
28.11.2011, 18:43 3
Цитата Сообщение от Сыроежка Посмотреть сообщение
равное размеру структуры
Нет, размеру указателя
0
sandye51
программист С++
837 / 596 / 147
Регистрация: 19.12.2010
Сообщений: 2,016
28.11.2011, 18:48 4
Цитата Сообщение от Сыроежка Посмотреть сообщение
32-битовой платформе это будет значение 8
может 4? указатель же
а так, по первым 2м пунктам тоже не вижу подвоха.

Добавлено через 3 минуты
да и по остальным тоже
0
Сыроежка
Заблокирован
28.11.2011, 18:49 5
Evg,
Единственное, на что я не обратил внимание - это на ваше объявление

C++
1
2
3
4
5
6
typedef struct
{
  int x, y;
} MyStruct;
 
typedef struct MyStruct* MyStructPtr;
У вас нет структуры с именем MyStruct, поэтому второй typedef некорректный. А почему я сразу не обратил внимание? Потому что я сразу же сделал вывод, что лучше писать

C++
1
2
3
4
typedef struct
{
  int x, y;
} MyStruct, * MyStructPtr ;

вместо двух typedef.
0
go
Эксперт С++
3637 / 1369 / 243
Регистрация: 16.04.2009
Сообщений: 4,527
28.11.2011, 18:50 6
Сыроежка, Если структура одно, то можно и так.
0
Сыроежка
Заблокирован
28.11.2011, 18:51 7
go,
sandye51,

Изучайте арифметику указателей!
Пардон! Я только сейчас заметил, что объявляется указатель на указатель!

C++
1
MyStructPtr *p;
Тогда действительно напечатает 4.

Но пример глупейший. Только время отнимает! То есть ждешь чего-нибудь серьезного, а у тебя проверяют внимательность.
0
go
Эксперт С++
3637 / 1369 / 243
Регистрация: 16.04.2009
Сообщений: 4,527
28.11.2011, 18:51 8
Цитата Сообщение от Evg Посмотреть сообщение
3. Что будет, если данный тест подать в компилятор Си++?
Если я не ошибаюсь, то в С++

C
1
typedef struct MyStruct* MyStructPtr;
struct опускается
0
Evg
Эксперт CАвтор FAQ
19619 / 7311 / 551
Регистрация: 30.03.2009
Сообщений: 20,452
Записей в блоге: 30
28.11.2011, 18:52  [ТС] 9
Цитата Сообщение от Сыроежка Посмотреть сообщение
У вас нет структуры с именем MyStruct, поэтому второй typedef некорректный
А ты скомпиляй да проверь, что тут корректно, а что нет. И для порядку ещё в стандарт загляни
0
go
Эксперт С++
3637 / 1369 / 243
Регистрация: 16.04.2009
Сообщений: 4,527
28.11.2011, 18:54 10
Цитата Сообщение от Сыроежка Посмотреть сообщение
Изучайте арифметику указателей!
http://codepad.org/0cEw53PR ага, удачи в изучении

Добавлено через 23 секунды
Evg, неслушайте его, все верно
0
Evg
Эксперт CАвтор FAQ
19619 / 7311 / 551
Регистрация: 30.03.2009
Сообщений: 20,452
Записей в блоге: 30
28.11.2011, 19:02  [ТС] 11
Цитата Сообщение от go Посмотреть сообщение
http://codepad.org/0cEw53PR ага, удачи в изучении
Хм... это я как-то кривыми ручками тест неверно написал

Правильный исходник вот такой (убрал звёздочку перед "p"):

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
 
typedef struct
{
  int x, y;
} MyStruct;
 
typedef struct MyStruct* MyStructPtr;
 
int main (void)
{
  MyStructPtr p;
 
  p = NULL;
  printf ("%p\n", p);
/*
  p++;
  printf ("%p\n", p);
*/
  return 0;
}
Модераторы, поправьте пожалуйста пример в первом посте
0
Сыроежка
Заблокирован
28.11.2011, 19:06 12
Я вам уже написал в комментарии к предыдущему примеру, что у вас нет структуры с именем MyStruct Поэтому определение указателя struct MyStruct *p; некорректно.
0
Evg
Эксперт CАвтор FAQ
19619 / 7311 / 551
Регистрация: 30.03.2009
Сообщений: 20,452
Записей в блоге: 30
28.11.2011, 19:09  [ТС] 13
Итак, поправил исходник. Там лишняя звёздочка была

Добавлено через 40 секунд
Цитата Сообщение от Сыроежка Посмотреть сообщение
Я вам уже написал в комментарии к предыдущему примеру, что у вас нет структуры с именем MyStruct Поэтому определение указателя struct MyStruct *p; некорректно
Я читал, что ты написал. А потому повторю ещё раз - иди читай стандарт.

Добавлено через 1 минуту
Пока я корячился с исправлением примера из поста #11, модераторуы уже внесли правку в головной посте. Но не страшно. И то и другое сейчас представляют собой правильный задуманный пример
0
Сыроежка
Заблокирован
28.11.2011, 19:18 14
Вы бы сами воспользовалист своим советом или на крайний случай попробовали бы откомплировать этот код в С++. Не помешает!
0
taras atavin
4206 / 1773 / 211
Регистрация: 24.11.2009
Сообщений: 27,565
28.11.2011, 19:19 15
Проглядел спецификатор. 0, потом размер структуры.
0
ForEveR
В астрале
Эксперт С++
8001 / 4759 / 653
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
28.11.2011, 19:20 16
Evg, Кстати С++ компилятор действительно на такое будет ругаться.
http://liveworkspace.org/code/1e89b291d823109236fc3b5bbd082860
0
go
Эксперт С++
3637 / 1369 / 243
Регистрация: 16.04.2009
Сообщений: 4,527
28.11.2011, 19:20 17
Цитата Сообщение от Evg Посмотреть сообщение
Хм... это я как-то кривыми ручками тест неверно написал
А вы пробовали компилировать? Не уверен, но тогда верно было, вот сейчас лучше было бы написать (явно привести к типу)
C
1
( ( MyStruct * ) p ) ++;
Но опять же не уверен, может и "как у Вас" отработает.
0
taras atavin
4206 / 1773 / 211
Регистрация: 24.11.2009
Сообщений: 27,565
28.11.2011, 19:21 18
Цитата Сообщение от go Посмотреть сообщение
Нет, размеру указателя
С какого перепугу?
0
go
Эксперт С++
3637 / 1369 / 243
Регистрация: 16.04.2009
Сообщений: 4,527
28.11.2011, 19:22 19
Цитата Сообщение от taras atavin Посмотреть сообщение
С какого перепугу?
Не верите? http://codepad.org/0cEw53PR
0
taras atavin
4206 / 1773 / 211
Регистрация: 24.11.2009
Сообщений: 27,565
28.11.2011, 19:23 20
++ для указателя смещает на размер данного, а не самого указателя.
0
28.11.2011, 19:23
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.11.2011, 19:23

Функция не возвращает указатель на структуру
как зделать. пробывал так typedef struct str str ; struct str{ /* */...

Передать указатель на структуру в параметре функции
Есть структура struct Test{ BYTE Size; BYTE* Mass; }; На чистом Си...

Заполнить структуру B которая содержит структуру A при условии тога что в A уже записано имя
Есть две структуры. struct A{ char name; char last; }; struct B{ char...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru