Стуктура и указатели

Тема в разделе "LANGS.C", создана пользователем buktak, 19 авг 2007.

  1. buktak

    buktak New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2007
    Сообщения:
    84
    Код (Text):
    1. #include <stdio.h>
    2.  
    3. typedef struct _a{
    4.     char d[2];
    5. }*psa;
    6.  
    7. int main(int argc, char* argv[])
    8. {
    9.     char a[10]={0};
    10.     psa b = (psa)a;
    11.     printf("%p, %p, %p\n", &b->d, &b->d[0], b->d);
    12.     return 0;
    13. }
    вывод:
    Код (Text):
    1. 0012FF74, 0012FF74, 0012FF74
    2. Press any key to continue
    Вопрос: &b->d - как такая конструкция не вызывает ошибок, ведь d - это массив?
     
  2. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    А почему она должна вызывать ошибку? Берется адрес члена структуры и передается в функцию printf. Компилятор не проверяет типы "непостоянных" аргументов функций с переменным числом параметров, это лежит на самой ф-ии. printf имеет прототип 'printf(const char *fmt, ...)', первый аргумент -- указатель на const char, остальные -- какие угодно и в каком угодно количестве.
     
  3. buktak

    buktak New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2007
    Сообщения:
    84
    int a[10];
    &a;

    такой код вызовет ошибку. А если спрятать массив в структуре, почему ошибки не возникает.
     
  4. nester7

    nester7 New Member

    Публикаций:
    0
    Регистрация:
    5 дек 2003
    Сообщения:
    720
    Адрес:
    Russia
    http://c-faq.com/
     
  5. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    На MS VS 6.0
    Код (Text):
    1. int main(int argc, char **argv)
    2. {
    3.     int a[10];
    4.     &a;
    5.  
    6.         return 0;
    7. }
    8. delme.exe - 0 error(s), 0 warning(s)
    все компилируется на ура.
     
  6. buktak

    buktak New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2007
    Сообщения:
    84
    вопрос снят.