Неполный тип массива?
когда я скомпилировал следующий код 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
оператора.
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;
}