2013-11-08 5 views
0

В следующих двух определениях структуры, в чем разница между ними?В чем разница между int var [] и int var [0]

struct A { 
    int var[]; 
}; 

struct B { 
    int var[0]; 
}; 

struct C { 
    int *var; 
}; 

Я думаю, что в случае использования этих структур они одинаковы. За ними стоит особое значение?

+1

... ASCII-символ 0 ?! –

+0

Возможно, дубликат этого: http://stackoverflow.com/questions/11733981/what-is-the-purpose-of-a-zero-length-array-in-a-struct –

ответ

4

Разница между A и B заключается в том, что вторая незаконна. Объявления массива, которые определяют 0 как размер, всегда безоговорочно запрещены в стандарте C. Если ваш компилятор принимает это объявление, это нестандартное расширение вашего компилятора.

Между тем объявление массива в A является функцией C99, которая объявляет гибкий член массива в конце структуры.

Декларация внутри C является объявлением указателя. A и B объявляют элементы массива, C объявляет элемент указателя. Итак, это твоя разница.

P.S. Если ваш компилятор принимает определение B, то он, скорее всего, будет таким же, как определение A.

+0

Могли бы вы также описать разницу между собой struct A и C? – jaeyong

+0

@jaeyong: Я не вижу, что описать, кроме очевидного: первые два содержат массивы, а 'C' содержит указатель. Это все. Надеюсь, вы понимаете разницу между массивом и указателем. Это всего лишь две разные вещи. – AnT

+0

@jaeyong: Элемент гибкого массива - это место, где будет массив, если для него выделяется пространство вместе с остальной частью структуры. Указатель - это объект, в котором может храниться адрес. Пространство должно быть выделено для массива, поэтому адрес этого массива должен быть сохранен в указателе. Массив не будет в том месте, где находится указатель. –

2
int var[] -> variable length array 

int var[0] -> does not have any element in the array // Illegal 

int *var -> it is an integer pointer that can store the address of integer 
       or base address of array of integers 

var[] VS *var 

    var[] -> array of integers, 

      var[0],var[1] -> this is how you access elements of array 

    *var -> needs initiailization of an address of an integer before it is used 

     1) int *var = &a; // if you have one integer    
     2) int *var = &a[0] // if you have array of integers save base address 
      var[1] or *(++var) // both are equivalent 

The advantage of integer pointer over integer array is to return an int pointer 
     in function calls because retuning array of integers is not possible 

Массивы должны иметь по крайней мере 1 элемент. Ваш int var[0] недействителен для определения длины массива. int var[1] действительно

0

Как указано другими, вторая декларация не является законной. Этот трюк обычно используется для структуры с переменным размером.

То же можно добиться законным путем, объявляя массив размером 1.

This question может помочь вам понять об этом.

Чтобы узнать больше, google variable sized structure или variable length structure.

Смежные вопросы