Initialize array with a non-const function argument

1.6k views Asked by At

Is there any way to initialize an array with a non-const integer, or to make the existing variable constant in order to make it a valid argument?

bool f( const char s[], const int n )
{
    char c[n]; // error: expression must have a constant value
}
3

There are 3 answers

6
AudioBubble On BEST ANSWER

No, not in the general case. Use vector<char> c(n) instead.

Simplified, almost correct explanation: if you don't know what n is at compile time, neither does the compiler. So it cannot put aside memory for the array. This is why vector exists.

You can always use &c[0] to get the pointer to char if you need it elsewhere.

But it is possible in C99, apparently. Thanks to @Matt McNabb for pointing this out. If you can wait a few years you might be able to compile it in C++, too. In the meanwhile, use vector.

If you insist to have an "array" in C++, you would have to do something like:

char* c = new char[n];

If your program does not run forever, or do this too often, you can even just leave it as it is and not bother deleting. Tools like Valgrind might complain though.

0
Kris On

Depending on the source of n, the answer is probably no. In case n can be a constexpr, then the answer is yes.

See this SO post for more information about constexpr: When should you use constexpr capability in C++11?

0
Максим Пихенько On

n is located on a stack. In this case a compiler needs to know the size of n at compile time. You can dynamically allocate memory by operator new, or use std::vector.