Стандарт C не имеет ничего общего с std::vector
или другими контейнерными структурами. Все, что вы получаете, это встроенные массивы и malloc
.
Полагаю, использование std :: vector решит проблему индексации вне области действия переменной.
Вы можете так думать, но вы ошибаетесь: индексирование за пределами std::vector
так же плохо, как и со встроенным массивом. operator[]
из std::vector
также не выполняет проверку границ (или, по крайней мере, это не гарантируется). Если вы хотите, чтобы ваши операции с индексами проверялись, вам нужно использовать arr.at(i)
вместо arr[i]
.
Также обратите внимание, что код типа
float z[l];
...
return z;
неверно, потому что в C нет значений массива (или C ++, если на то пошло). Когда вы пытаетесь получить значение массива, вы фактически получаете указатель на его первый элемент. Но этот первый элемент (и все другие элементы, и весь массив) уничтожается, когда функция возвращается, так что это классическая ошибка использования после освобождения: вызывающая сторона получает висячий указатель на объект, который больше не существует.
Обычное решение C состоит в том, чтобы вызывающая сторона имела дело с распределением памяти и передавала выходной параметр, в который функция просто записывает:
void foo(float *z, const int *X, const int *Y, int l){
// X and Y are arrays of length l
for (int i = 0; i < l; i ++){
z[i] = X[i]+Y[i];
}
}
Тем не менее, есть некоторые библиотеки, которые предоставляют динамические структуры данных для C, но они обязательно должны выглядеть и чувствовать себя очень отличающимися от C ++ и std::vector
(например, я знаю о GLib ).