2016-03-16 4 views
-2

У меня есть массив нулевой ячейки, и я хочу его размер. мой код:C программирование - размер массива

#include <stdio.h> 
#include <string.h> 
#include <stdint.h> 

typedef struct ts_ff { 

    uint8_t reserved[0]; 
} TS_fact; 

int main(void) { 
    TS_fact ts_factory; 
    printf("size of reserved is %zu Bytes\n",sizeof(ts_factory)); 

    return 0; 
} 

Но возвращение этого кода возврата 0 Bytes не 1 байт для этой ячейки массива.

size of reserved is 0 Bytes 

Почему компилятор это делает?

+0

Одна ячейка? Я вижу нулевые ячейки. – gnasher729

+2

* массив одной ячейки * => Где? –

+0

ОК. SO, почему я могу использовать ts_factory.reserved [0] = 12; например. И я могу использовать эту ячейку. Компилятор влияет на значение без ошибок. –

ответ

2

Компилятор верен, так как размер массива равен 0, вам нужно изменить размер массива в вашем коде столько, сколько вам нужно.
uint8_t reserved[N];
N - это размер массива, в котором вы нуждаетесь.

Как компилятор принял это: Все имеет уникальный идентификатор, т.е. уникальный адрес, который подразумевает ненулевой length.It законно выделить массив нулевого размера. Вы просто ничего не можете сделать с , так как для вас нет доступных данных. Но reserved[0] = 10; является незаконным.

+0

Да. Я знаю это . Но я хочу понять, почему компилятор принимает ассоциацию значения для индекса массива, иначе он не выделяется для него, и я вижу корректное значение. –

+0

@MarwenBkh обновил мой ответ, надеюсь, это поможет –

+0

Я говорю, что зарезервировано [0] = 10 является незаконным. Вы должны попробовать сначала, потому что компилятор принимает его и правильно отображает его связанную ценность. –

2

компилятора правильно: у вас есть массив размера нулевой (uint8_t reserved[0]) в качестве единственного члена вашей структуры, так sizeof дает ноль. Зачем выделять память для объекта с нулевым размером?

4

uint8_t reserved[0]; Это массив размером 0

поэтому SizeOf будет равна нулю.

1

Это НКУ расширение, и недействительна в стандарте C с 1999

Посмотрите на https://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html

Это был хак, который существовал в 1989 году стандарта C, и в ранее (предварительный стандарт) C . Вероятно, именно поэтому gcc поддерживает его как расширение.