C - Лишние элементы в массиве

Я изучаю C и играю с указателями и массивами. Я пытаюсь создать массив указателей с помощью кода ниже:

const int NUM_P = 50; // Line 10
char *pS[NUM_P] = { NULL }; // Line 11

Я получаю следующие предупреждения и ошибки при компиляции:

→ gcc array.c -o array
array.c: В функции 'main':
array.c:11: ошибка: объект переменного размера не может быть инициализирован
array.c: 11: предупреждение: лишние элементы в инициализаторе массива
array.c:11: предупреждение: (почти инициализация для 'pS')

Я не могу понять эту ошибку, я искал в Интернете и не смог найти объяснение и решение проблемы.

Кто-нибудь может помочь?

Ваше здоровье

Эф


person RailsSon    schedule 05.11.2009    source источник
comment
Что вы пытаетесь сделать в char *pS[NUM_P] = {NULL}; ?   -  person    schedule 05.11.2009
comment
Возможно, синтаксис C немного сбивает с толку. В C const int означает, что вы создаете переменную, которую не планируете изменять после инициализации. В C++ это настоящая константа, и ее можно использовать так, как вы пробовали.   -  person Tim Allman    schedule 05.11.2009


Ответы (1)


Ваша основная проблема заключается в строке инициализации (= {NULL};), потому что, по-видимому, вы не можете инициализировать массив таким образом, когда размер массива является переменной. Если вы используете #define NUM_P 50, чтобы заставить размер массива быть настоящей константой времени компиляции, тогда массив не будет иметь переменный размер, и ваш метод инициализации будет нормально компилироваться.

В качестве примечания: разница между #define NUM_P 50 и const int NUM_P = 50 заключается в том, что C89 не позволяет использовать переменные в качестве измерений массива, а C99 позволяет; однако C99 еще не полностью поддерживается всеми компиляторами. Тот факт, что gcc принимает массив символов размером NUM_P, несовместим с C89.

Технически вы можете использовать флаг в командной строке, чтобы указать gcc, что вы хотите скомпилировать в C99:

gcc -std=c99 FILE.c

Кстати, при изучении C начинайте с верхней части списка ошибок и двигайтесь вниз оттуда. В этом случае предупреждения не имеют значения, пока вы не устраните ошибку вверху: "объект переменного размера не может быть инициализирован".

person Mark Rushakoff    schedule 05.11.2009
comment
Спасибо, принимая '= {NULL};' исправил проблему, и она работает нормально. На самом деле я слежу за книгой «C - от новичка до профессионала», и она была частью исходного кода для учебника! Теперь работает, еще раз спасибо. Эф - person RailsSon; 05.11.2009