Назначение указателя на больший массив указателю на меньший VLA - PullRequest
0 голосов
/ 12 декабря 2018

Я заметил, что компиляторы C (gcc, clang, tinycc) позволяют мне назначать указатель на больший массив указателю на меньший VLA без предупреждения:

#include <stdio.h>
#if !__TINYC__
void take_vla(int N, char const X[1][N]) { printf("%zd\n", sizeof(*X)); }
#endif
int main()
{
    static char bigarray[]="0123456789abcdefghijklmnopqrstuvwxyz";
    //VLA
    int n = 3;
    char const (*subarray2)[n]=&bigarray;
    //char const (*subarray3)[(int){3}]=&bigarray; //VLA but clang doesn't see it as such (a bug, I guess)
#if !__TINYC__
    take_vla(3,&bigarray);
    take_vla(3,&"abcdefg");
#endif

    #if 0
        char const (*subarray1)[3]=&bigarray; //-Wincompatible-pointer-types
    #endif
}

Является ли это совместимым C и почему

1 Ответ

0 голосов
/ 12 декабря 2018

const char[3] несовместимо с char[37].

Также «указатель на квалифицированный тип» не совместим с «указателем на тип» - не путайте это с «указателем на тип».(Корректность констант, к сожалению, не работает с указателями массива.)

Соответствующей частью является правило простого присваивания C17 6.5.16.1:

  • левый операнд имеет атомарный,квалифицированный или неквалифицированный тип указателя, и (учитывая тип, который будет иметь левый операнд после преобразования lvalue) оба операнда являются указателями на квалифицированные или неквалифицированные версии совместимых типов, а тип, на который указывает левый, имеет все квалификаторы указанного типасправа;

Просмотр различных компиляторов:

  • gcc в "режиме GNU" бесполезен для проверки соответствия Си.Вы должны скомпилировать с -std=cxx -pedantic-errors.После чего gcc ведет себя нормально: gcc -std=c17 -pedantic-errors:

    Ошибка: указатели на массивы с различными квалификаторами несовместимы в ISO C [-Wpedantic]

  • icc дает ту же диагностику, что и gcc, работает нормально.

  • Принимая во внимание, что clang -std=c17 -pedantic-errors не сообщает об ошибках, поэтому он, очевидно, не соответствует стандарту C,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...