I\'m trying to initiate a static variable (inside a function) with malloc in C, but I\'m getting the \"initializer not constant error\". I know that I can\'t initiate a stat
malloc()
is only used to allocate memory at runtime. Static variables are initialized at sompile time. You want:
static int p[1];
If it is file static, then you should provide a public function in that file that will initialize that static.
void initialize () {
if (p == 0) p = malloc(sizeof(*p));
}
Or, you can use a static function instead of a static variable. It costs you a check per access though:
static int * p () {
static int * p_;
return p_ ? p_ : (p_ = malloc(sizeof(*p_)));
}
For an integer type, this seems a little silly, but if p
were some more complex type that required a more complicated initialization sequence than just the return value of malloc()
, then it might make sense to have something like this.
Assuming you want function-static variables:
int foo(void) {
static int b=1;
static int *p;
if (b) {
p = malloc(sizeof(int));
b = 0;
}
...
}
You can use NULL value for p as a check, as long as you know it will never be NULL
after the first call.
Remember to check for errors in malloc; it is a runtime allocation, and should also be freed when it will not be needed anymore.
C can't do that. C++ can with static constructors.
You could do the allocation first thing in main(), or in any other function that is called before your pointer is needed.
While nonportable, some executable formats such as the Classic Mac OS' Code Fragment Manager support initialization/termination entry points. The CFM initialization was used for C++ static construction. If the executable format on your platform supports an initialization entry point, you could use that.
static int *p = NULL;
if(!p) p = (int *)malloc(sizeof(int));