Тип во время инициализации массива - PullRequest
2 голосов
/ 29 августа 2011

Если в моей программе у меня есть это:

int arr[some_number];

Какой тип some_number?

  1. Целое число?
  2. Целое число без знака?
  3. Автоматически определяется (long, unsigned long и т. Д.)

Это можетбыть гипотетическим вопросом (предполагая, что я могу выделить столько памяти, сколько необходимо во время компиляции), просто любопытно узнать, является ли тип some_number всегда целочисленным.

** РЕДАКТИРОВАТЬ В случае, если мой язык не понятен, в системе, где sizeof (целое число) составляет 2 байта, и я определяю массив как:

int arr [65537], переполнится ли "65537", и это эффективно, int arr [-1]?

Ответы [ 6 ]

4 голосов
/ 29 августа 2011

some_number должен быть либо действительным положительным целым числом, как в: -

int arr[1024]

или это может быть МАКРО, которое преобразуется в положительное целое число: -

#DEFINE some_number 1024
int arr[some_number]

Так как интерпретация выполняется во время компиляции и не используется программная переменная, тогда нет "типа".

2 голосов
/ 29 августа 2011

По умолчанию в Си тип числа int. Вы можете использовать суффикс u, чтобы сделать его целым без знака, суффикс l, чтобы сделать его long (а с некоторым компилятором суффикс ll, чтобы сделать его long long, то есть 64- бит целое).

0 голосов
/ 29 августа 2011

Предположим, что это определение внутри функции, some_number может быть любым интегральным выражением со строго положительным значением.Если он непостоянный, зверя называют массив переменной длины , VLA.

Если вы поместите его во внешнюю область или сделаете его static, он должен вычислить что-то, чтоявляется постоянным.

0 голосов
/ 29 августа 2011

some_number должен быть ИСТИННОЙ константой, она не может быть переменной. например

 main()
{
int a=1;
int kk[a]={1};
}

Это приведет к ошибке, говорящей

 variable-sized object may not be initialized

Однако мы также не можем использовать

int const a;

, так как индекс массива из-за того, что const не считается истинной константой в C.

0 голосов
/ 29 августа 2011

Я думаю, что это тип size_t, который может отличаться от одной платформы к другой.Это без знака, это точно.Посмотрите на это .

0 голосов
/ 29 августа 2011

Тип выражения не зависит от контекста, поэтому тип some_number (на самом деле some_expression) будет таким же, как если бы он использовался не в определении массива. Другой вопрос, какие типы выражений разрешены для обозначения размера массива.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...