2016-08-25 2 views
1

Что на самом деле произошло в следующей программе, я определил пустой массив int arr[]; в коде и компиляторе GCC, но компилятор не дает ошибку. Он успешно работает.Определенный пустой массив в c

#include <stdio.h> 
#include <stdlib.h> 

typedef struct st 
{ 
     int i; 
     int arr[]; 
}ST,*ptr; 

int main() 
{ 
     ST s1; 
     ptr p1= (ptr)malloc(sizeof(ST)+4*sizeof(int)); 

     p1->i=10; 
     p1->arr[0]=1; 
     p1->arr[3] = 1; 

     printf("%d\n",p1->arr[3]); 
     printf("%ld\n", sizeof(s1)); 
} 

C язык не имеет длину неопределенного массива. но GCC компилятор разрешено. Зачем?

Просто любопытно, что на самом деле происходит?

+5

стандарт Си позволяет это. Найдите «гибкий элемент массива». – haccks

+5

[Элемент гибкого массива] (https://en.wikipedia.org/wiki/Flexible_array_member), два предложения: не бросайте 'malloc' и не скрывайте указатели с' typedef ' –

+0

В качестве последнего члена struct, полезно, когда структура хранит переменный объем данных. –

ответ

3

Действителен и разрешен с C99. Он называется flexible array member - полезно сделать последний член переменной struct length, и он должен быть последним последним членом структуры, если используется.

1

С99, структура последнего элемента позволяет размер массива неизвестен, который называется членом гибкого массива, но в передней части структуры гибкого элемента массива должна иметь по крайней мере один другие член.

Элементы гибкого массива, разрешенные к структуре, содержат массив переменного размера. Этот размер структуры sizeof Возврат не включает гибкий массив памяти. Структура, содержащая гибкий элемент массива с использованием функции malloc(), динамически распределяет память и выделяет память, которая должна быть больше размера структуры для размещения ожидаемого размера гибкого массива.

Базовая модель

typedef struct st 
{ 
     int i; 
     int arr[]; 
}ST,*ptr; 

Испытано под Linux, GCC об операционных результатов для структуры, последний элемент массива и массив неопределенной длины, операционные результаты, согласующиеся с теорией, это немного похоже aC++ функции-члены класса, функции-члены не занимают размер пространства класса. Ну, этот гибкий массив, есть роль того, что есть.

2

Вы просматриваете функцию C99, Flexible array member. Если массив определен в конце структуры, то вы определяете его размер при распределении через malloc, выделяя большую часть памяти.

для массива размером len:

struct st *mySt = malloc(sizeof(struct st) + len * sizeof(mySt->arr[0]));