
Data Structure
Networking
RDBMS
Operating System
Java
MS Excel
iOS
HTML
CSS
Android
Python
C Programming
C++
C#
MongoDB
MySQL
Javascript
PHP
- Selected Reading
- UPSC IAS Exams Notes
- Developer's Best Practices
- Questions and Answers
- Effective Resume Writing
- HR Interview Questions
- Computer Glossary
- Who is Who
Does C++ Support Variable Length Arrays?
No, C++ does not support Variable Length Arrays (VLAs). A Variable length array is an array whose size is determined at runtime, not at compile time. These types of arrays are only supported in C99 version of C language. In this article, we will discuss the reasons why C++ does not support VLAs and what alternatives are available for variable array allocation.
What is Variable Length Array (VLA)?
A Variable Length Array (VLA) is an array whose size can be determined at runtime. It is not supported in standard C++. But, in C99 you can declare a VLA like this:
// Only valid in C99 void func(int n) { int arr[n]; } func(5); // Call with size 5
In the above code, the size of the array arr is determined at runtime based on the value of n passed to the function func().
Why C++ Does Not Support VLAs?
C++ does not support VLAs for following reasons:
- Proper Memory Management: C++ focuses on strong type safety and memory management. VLAs can cause issues with memory allocation and deallocation.
- Undefined Behavior: VLAs can lead to undefined behavior if the size is not properly managed.
- Have alternatives for VLAs: C++ provides std::vector, dynamic allocation with 'new' as an alternative to VLAs. Here, either C++ automatically manages memory or developer can manage memory manually using new and delete.
Alternatives to VLAs in C++
In C++, you can achieve similar functionality to VLAs using the following alternatives:
1. Using Vectors
The vectors in C++ are a type of dynamic array that can grow and shrink in size at runtime. They are part of the C++ Standard Template Library (STL) defined in <vector> header file. Vectors are more flexible than arrays, as they can change size dynamically and manage memory automatically. Following code snippet shows how to declare and use a vector in C++:
#include <iostream> #include <vector> using namespace std; void func(int n) { vector<int> arr(n); // Allocate vector of size n // Fill with example values for (int i = 0; i < n; ++i) { arr[i] = i * 2; } // Display the vector cout << "Contents of vector:\n"; for (int i = 0; i < n; ++i) { cout << arr[i] << " "; } cout << endl; } int main() { func(5); // Call with size 5 return 0; }
The output of the above code will be:
Contents of vector: 0 2 4 6 8
2. Dynamic Allocation with new
In C++, you can also allocate memory dynamically using the new keyword. But in this method, you have to manually deallocate the memory using the delete[] operator to avoid memory leaks. Following code shows how to declare and use a dynamically allocated array using new in C++:
#include <iostream> using namespace std; void func(int n) { // Dynamically allocate array int* arr = new int[n]; // Fill with example values for (int i = 0; i < n; ++i) { arr[i] = i * 2; } // Display the array cout << "Contents of array:\n"; for (int i = 0; i < n; ++i) { cout << arr[i] << " "; } cout << endl; delete[] arr; // Deallocate memory } int main() { func(5); // Call with size 5 return 0; }
The output of the above code will be:
Contents of array: 0 2 4 6 8
3. Using std::unique_ptr
The std::unique_ptr in C++ provides a safer way to manage dynamically allocated arrays. It automatically frees memory when it goes out of scope. So, not needed to manually call delete[] to free up the memory. It is part of the <memory> header file and is a modern C++ alternative to raw pointers. Following code snippet shows how to use std::unique_ptr with a dynamically allocated array:
#include <iostream> #include <memory> using namespace std; void func(int n) { unique_ptr<int[]> arr(new int[n]); // Safer dynamic allocation // Fill with example values for (int i = 0; i < n; ++i) { arr[i] = i * 2; } // Display the array cout << "Contents of array:\n"; for (int i = 0; i < n; ++i) { cout << arr[i] << " "; } cout << endl; } int main() { func(5); // Call with size 5 return 0; }
The output of the above code will be:
Contents of array: 0 2 4 6 8