Неполный тип массива?

когда я скомпилировал следующий код gcc -Wall -pedantic -ansi -std=c89, он успешно скомпилирован без предоставления ошибки при назначении указателя. Обратите внимание, что я конвертирую из int (*)[4] to int (*)[].

int arr[4];
int (*p_arr)[] = &arr;

предполагая, что есть какая-то причина для разрешения этого (несовместимого?) Назначение, Когда я пытаюсь его использовать, компилятор дает неполный тип error error: invalid application of ‘sizeof’ to incomplete type ‘int[]’.

(void) sizeof(*p_arr);

эта ошибка заставляет меня думать, что использование разрешения предыдущего назначения указателя p_arr = &arr? Заключаться в следующем назначение разрешено согласно стандарту?

я использовал неполный тип структуры / объединения (обычно для прямого объявления), а также столкнулся с ошибкой incomplete array element type. Но это!--8--> новое для меня. Возможно ли это в стандарте C и имеет прецедент?

1 ответов


это назначение не дало никакой ошибки, потому что их типы совместимы, потому что массивы неизвестной границы совместимы с любым массивом совместимого типа элементов. (Для справки)-

int (*p_arr)[] = &arr;

но дает ошибку при передаче его как операнда sizeof оператора *p_arr имеет неполный тип и вы не должны использовать неполные типы в качестве операнда sizeof оператора.

N1570 6.5.3.4

1 оператор sizeof не применяется к выражению, имеющему тип функции или неполный тип, к заключенному в скобки имени такого типа или к выражению, которое обозначает элемент битового поля[...].

теперь то, что вы можете использовать его, вот простой пример -

#include <stdio.h>

int main(void){
    int arr[4]={1,2,3,4};
    int a[6]={1,2,3,3,1,1}; 
    int (*p_arr)[] = &arr;
    for(int i=0;i<4;i++)
       printf("%d",(*p_arr)[i]);
    printf("\n");
    p_arr=&a;
    for(int i=0;i<6;i++)
       printf("%d",(*p_arr)[i]);
    return 0;
}