Подтвердить что ты не робот

Измененный массив в области файлов в C

У меня есть такой код:

static int a = 6;
static int b = 3;

static int Hello[a][b] =
{
    { 1,2,3},
    { 1,2,3},
    { 1,2,3},
    { 1,2,3},
    { 1,2,3},
    { 1,2,3}
};

но когда я его компилирую, он говорит об ошибке:

изменено "Hello" в области содержимого

как это могло произойти? и как я могу это исправить?

4b9b3361

Ответ 1

У вас не может быть статический массив, размер которого задается как переменная

Вот почему константы должны быть #define d:

#define a 6

Таким образом, препроцессор заменит a на 6, сделав его допустимым.

Ответ 2

Простой ответ variable modified array at file scope is not possible.

Подробно:

сделать это время компиляции integral constant expression, так как длина массива должна быть указана во время компиляции.

вот так:

#define a 6
#define b 3

Или, следуйте стандарту c99. и скомпилировать как для gcc.

gcc -Wall -std=c99 test.c -o test.out

Проблема здесь в массиве переменной длины, при этом длина длины не может быть инициализирована, поэтому вы получаете эту ошибку.

просто

static int a =6;
static int b =3;

void any_func()
{
int Hello [a][b]; // no need of initialization no static array means no file scope.
}

Теперь используйте цикл или любой цикл для заполнения массива.

Для получения дополнительной информации просто DEMO:

#include <stdio.h>
static int a = 6; 
int main()
{
int Hello[a]={1,2,3,4,5,6}; // see here initialization of array Hello it in function
                            //scope but still error
return 0;
}


[email protected]:~/c# clang -std=c99 vararr.c -o vararr
vararr.c:8:11: error: variable-sized object may not be initialized
int Hello[a]={1,2,3,4,5,6};
          ^
1 error generated. 

Если вы удалите статический файл и выполните инициализацию, он будет генерировать ошибку, как указано выше.

Но если вы сохраните статическую и инициализацию, все равно будет ошибка.

Но если вы удалите инициализацию и сохраните static, появится следующая ошибка.

error: variable length array declaration not allowed at file scope
static int Hello[a];
           ^     ~
1 error generated.

Таким образом, объявление массива переменной длины не допускается в области файла, поэтому сделайте его функцией или заблокируйте область внутри любой функции (но помните, что ее функция должна удалять инициализацию)

ПРИМЕЧАНИЕ. Поскольку тег C помечен так, что сделать a и b как const не поможет, но в C++ const будет работать нормально.

Ответ 3

При использовании CLANG/LLVM выполняется следующее:

static const int a = 6;
static const int b = 3;

static int Hello[a][b] =
{
    { 1,2,3},
    { 1,2,3},
    { 1,2,3},
    { 1,2,3},
    { 1,2,3},
    { 1,2,3}
}; 

(Чтобы увидеть его в сгенерированной сборке, нужно использовать Hello, чтобы он не был оптимизирован)

Однако это приведет к возникновению ошибки, если выбран режим C99 (-std = c99), он будет генерировать предупреждение (Wgnu-folding-constant), если выбран -pedantic.

GCC, похоже, не допускает этого (const интерпретируется как только для чтения)

См. объяснение в этой теме:

"Элемент инициализатора не вл етс константным" ошибка без каких-либо причин в Linux GCC, компиляция C