Как я могу создать массив на C, не зная заранее длины? Я не могу предположить, что система будет использовать какой-либо конкретный стандарт

#c #arrays

#c #массивы

Вопрос:

Я попытался сделать что-то вроде:

 int z = 1;
int *p = amp;z;
*(  p) = 2;
printf("%d",*p);
  

Я бы предположил, что *p=22 и *(p-1)=1, но код будет скомпилирован, и когда я попытаюсь его распечатать, он выйдет из строя. Я буду знать длину во время выполнения, это пользовательский ввод.

Спасибо.

Комментарии:

1. Посмотрите malloc .

2. Для этого вы используете динамическое выделение памяти.

3. Получите учебник по C.

4. Вы никогда не должны пытаться возиться с выделенной стеком памятью вне вашего фрейма стека, в C, если вы должны были объявить и инициализировать переменную в функции, скажем int z = 1 , память для этого фиксирована и выделяется сразу после вызова функции. Посмотрите на динамически выделяемую память в C.

5. Если вы не можете принять какой-либо разумный стандарт за пределами ANSI C, вам следует хотя бы прочитать второе издание книги K amp; R «Язык программирования C», в котором рассказывается о том, как реализовать malloc функцию для выделения памяти указателям во время выполнения.

Ответ №1:

z является скаляром.

int *p = amp;z; допустимо. p также допустимо, поскольку вам разрешено указывать на единицу после адреса скаляра.

Но поведение при разыменовании этого указателя (с *( p) ) не определено.

Рассмотрите возможность использования массива переменной длины (начиная с C99, хотя даже компилятор, совместимый со стандартом C11, может отказаться от реализации массивов переменной длины). В противном случае используйте malloc , который был частью стандарта C, по крайней мере, с 1978 года.

Комментарии:

1. Обратите внимание, что массивы переменной длины поддерживаются только начиная с C99

2. @Cantfindname C99 — это стандарт 17-летней давности, даже C11 уже 5 лет.

3. @mch Но OP сказал: «Я не могу предположить, что система будет использовать какой-либо конкретный стандарт». OP может потребоваться использовать какой-нибудь дерьмовый компилятор Microsoft C или что-то в этом роде.

4. Не говоря уже о том, что C11 говорит, что «Массивы переменной длины являются условной функцией, которую реализации не должны поддерживать».

Ответ №2:

Вы бы использовали malloc и realloc для выделения и перераспределения памяти для указателей, для создания массивов во время выполнения.

Обратите внимание, что отмена ссылок на память, которую вы не выделили, т. Е. Пространство «вне» вашего массива времени выполнения, — это неопределенное поведение, которое может вызвать сбои или другие проблемы. Не делайте этого.