Home > database >  why am i getting warnings errors due to assignment of a variable's address to a pointer in the
why am i getting warnings errors due to assignment of a variable's address to a pointer in the

Time:01-09

I am just getting started with pointers and this following program is being flagged by compiler for some reason I am not able comprehend. the code is as follows:

#include <stdio.h>

int dec = 0;
int *d;
d = &dec;

int main() {
    return 0;
}

there is no error when I am stuffing these declarations in to main's body. the version of gcc I am using is gcc version 12.2.0(downloaded using MSYS2) and code editor MS visual code.can anybody post an explanation for this?

as i have stated above i have randomly started typing a program to get familiar with pointers, i expected there to be no variation in the treatment of pointers regardless of where they are being declared and intialised.

CodePudding user response:

You're attempting to perform an assignment outside of a function, which is not allowed. What you can do is initialize:

int *d = &dec;

CodePudding user response:

You may use only declarations in file scopes.

In the provided program you are using an assignment statement

d = &dec;

in the file scope. So the compiler issues an error.

Instead you could write for example

#include <stdio.h>

int dec = 0;
int *d = &dec;

int main( void ) {
    return 0;
}

As the variable dec has static storage duration then the expression &dec is an address constant and my be used as an initializer for the variable d that also has static storage duration.

From the C Standard (6.7.9 Initialization)

4 All the expressions in an initializer for an object that has static or thread storage duration shall be constant expressions or string literals.

and (6.6 Constant expressions)

7 More latitude is permitted for constant expressions in initializers. Such a constant expression shall be, or evaluate to, one of the following:

— an arithmetic constant expression,

— a null pointer constant,

— an address constant, or

— an address constant for a complete object type plus or minus an integer constant expression.

and

9 An address constant is a null pointer, a pointer to an lvalue designating an object of static storage duration, or a pointer to a function designator; it shall be created explicitly using the unary & operator or an integer constant cast to pointer type, or implicitly by the use of an expression of array or function type. The array-subscript [] and member-access . and -> operators, the address & and indirection * unary operators, and pointer casts may be used in the creation of an address constant, but the value of an object shall not be accessed by use of these operators.

  • Related