Re фрагмента кода
int a[1];
int *arr= &a[0];
& hellip; Вы спросите
” если я делать назначения случайные значения для обр [я] (от г = 0 до I = определяется пользователем) будет ли он принимать его за пределы = 1
и ответ будет, код будет принят (возможно, с предупреждением), но он будет иметь Неопределенное поведение, UB, поскольку вы будете хранить значения за пределами выделенного массива, который имеет размер 1.
Автоматического расширения необработанного массива нет.
Основной размер массива в динамической C++, является std::vector
. Например.
#include <vector>
using namespace std;
auto main() -> int
{
vector<int> a(100);
// Your code using it, here.
}
& hellip; динамическое распределение буфера. Он также автоматически освобождается в конце. И он может динамически расширяться, например. когда вы используете метод push_back
.
С сырых указателей вы можете вместо этого сделать
auto main() -> int
{
int* a = new int[100];
// Your code using it, here.
delete[] a;
}
& hellip; но это более хрупкий код, и ему не хватает большой функциональности std::vector
, такой как проверка размера, добавления, назначения и общего копирования (особенно для результата функции).
И даже базовая функциональность декларации не полностью эквивалентен, так как с std::vector
элементы массива равен нуль инициализированы по умолчанию, в то время как new
-expression производит неинициализированных массив, занимающее неопределенных значений , Однако вы можете указать, что вы хотите нулевую инициализацию, добавив пустую скобку. Тогда это выглядит следующим образом:
int* a = new int[100]();
Это лишь один из многочисленных тонкостей вам приходится иметь дело с тем, когда вы используете сырые указатели и сырые массивы.
В качестве новичка вы должны стараться избегать необработанных указателей и необработанных массивов.
Вы не можете полностью избежать их (например, main
принимает аргумент необработанного массива, любой строковый литерал представляет собой необработанный массив, а API-интерфейсы типа C имеют дело с необработанными массивами), но чем больше вы их избегаете, тем меньше проблем, и тем продуктивнее вы.
C++ дает вам много веревки, чтобы повесить себя. –
Вы можете сделать 'int a [1]; a [10] = 5; '. Это может сработать. Или это может упасть. Или это может сработать, но затем может произойти сбой следующего вызова 'printf'. Или это может сработать, но затем вдруг 'printf ("% d \ n ", 1 + 1);' prints 8. – immibis