Array size with const variable in C [duplicate]

柔情痞子 提交于 2019-12-22 05:11:33

问题


I've found an interesting fact, and I didn't understand how is it works.
The following piece of code just works perfectly.

#include <stdio.h>
 int main(){
  const int size = 10;
  int sampleArray[size];
  typedef char String [size];
  return 0;
}

Then, I tried to use only and only the constant variable with a global scope, and it's still fine.

#include <stdio.h>
const int size = 10;
 int main(){
  int sampleArray[size];
  typedef char String [size];
  return 0;
}


But, if I change the arrays's scope to global as well, I got the following:

error: variably modified ‘sampleArray’ at file scope

#include <stdio.h>
const int size = 10;
int sampleArray[size];
typedef char String [size];
 int main(){
  return 0;
}

And I didn't get it! If I'd replace the const variable for ex. to #define it'd be okay as well.
I know that the #define variable is preprocessed, and as far as I know the const variable is only read-only. But what does make the global scope after all?

I don't understand what is the problem with the third piece of code, if the second one is just okay.


回答1:


Variable Length Arrays may have only automatic storage duration. VLAs were introduced in C99.

It is not allowed to declare a VLA with the static storage duration because the size of VLA is determinated at the run time (see below)

Before this Standard you can use either a macro like

#define SIZE 10

//...

int a[SIZE];

or a enumerator of an enumeration like

enum { SIZE = 10; }

//...

int a[SIZE];

By the way you may remove the const qualifier and just write

int size = 10;

instead of

const int size = 10;

(In C++ you have to use the const qualifier though in C++ there are no VLAs except that some compilers can have their own language extensions)

Take into account that the sizeof operator for VLAs is calculated at the run-time instead of the compile-time.



来源:https://stackoverflow.com/questions/40599032/array-size-with-const-variable-in-c

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!