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