Home > database >  What does invalid initializer mean?
What does invalid initializer mean?

Time:11-23

Having this code:

#include <stdio.h>
#include <stdlib.h>

#define SIZE 5

int main()
{
    //int (*ar)[10] = malloc(sizeof *ar * SIZE);
    int *ar[10] = malloc(sizeof *ar * SIZE);
    printf("%ld\n", sizeof *ar);
}

I got

a.c:8:19: error: invalid initializer
    8 |     int *ar[10] = malloc(sizeof *ar * SIZE);
      |

Why is this pointer initialization uses "invalid initializer"? What is invalid here?

CodePudding user response:

You declared an array of 10 elements of the type int *

int *ar[10] = malloc(sizeof *ar * SIZE);

and trying to initialize the array with the expression malloc(sizeof *ar * SIZE). So the compiler issues the error message.

If you want to dynamically allocate an array with SIZE elements of the type char[10] then you need to write

int ( *ar )[10] = malloc( SIZE * sizeof( char[10] ) );

To make the declaration of the pointer simpler you could introduce a typedef declaration for the array of 10 elements. For example

typedef int TArray[10];
TArray *ar = malloc( SIZE * sizeof( TArray ) );

Pay attention to that you need to use the conversion specifier %zu to output objects of the type size_t (it is the type of the value returned by the operator sizeof). For example

printf("%zu\n", sizeof *ar);

This call will output the value equal to 10 * sizeof( int ). If the sizeof( int ) is equal to 4 then the outputted value will be 40.

CodePudding user response:

Just like 3 (4*5) is completely different than (3 4)*5,

int *(x[10]);    // int *x[10];

is completely different than

int (*x)[10];

The following creates an array of 10 pointers:

int *ar[10];

Arrays are initialized using { }.[1] For example, you could use the following:

int *ar[10] = {
   NULL, NULL, NULL, NULL, NULL,
   NULL, NULL, NULL, NULL, NULL
};

But in this case, you might use something like this:

int *ar[10];

for (int i=10; i--; ) {
   ar[i] = malloc(sizeof(*ar));
   *(ar[i]) = 0;
}

This produces the following:

                           ---------------     sizeof( ar       ) == sizeof( int * ) * 10
ar                    --->| 0             |    sizeof( ar[0]    ) == sizeof( int * )
 ---------------     |     ---------------     sizeof( *(ar[0]) ) == sizeof( int   )
|             ------- 
 --------------- 
|             ------- 
 ---------------     |     --------------- 
|               |     --->| 0             |
       ...                 --------------- 
|               |
 --------------- 

The following creates a (single) pointer to an array of 10 pointers.

int (*p)[10];

It could be allocated as follows:

int (*p)[10] = malloc(sizeof(*p));

for (int i=10; i--; )
   (*p)[i] = 0;

This produces the following:

p
 ---------------           ---------------     sizeof( p       ) == sizeof( int * )
|             ----------->| 0             |    sizeof( *p      ) == sizeof( int * ) * 10
 ---------------           ---------------     sizeof( (*p)[0] ) == sizeof( int   )
                          | 0             |
                           --------------- 
                          |               |
                                 ...       
                          |               |
                           --------------- 

  1. Special case,

    char s[] = "abc";
    

    is a shorthand for

    char s[] = { 'a', 'b', 'c', 0 };
    

CodePudding user response:

int *ar[10];

Is an array of 10 pointers to int. You need a pointer (not array) to dynamically allocate memory for the referencceod object.

Depending on type of the pointer you can:

int *ar = malloc(sizeof *ar * SIZE);   // space for SZIE integers
int **ar = malloc(sizeof *ar * SIZE);  // space for SIZE pointer to integers
int (*ar)[10] = malloc(sizeof *ar * SIZE); // space for SIZE * 10 integers, but pointer type is array to 10 integers/

CodePudding user response:

Why is this pointer initialization uses "invalid initializer"? What is invalid here?

int *ar[10] does not declare a pointer. It declares an array. Initializers for an array should be inside braces, { … }, so malloc(sizeof *ar * SIZE) is not valid to initialize an array.

Brackets, [ … ] bind more tightly than the dereference operator, *, so int *ar[10] is int *(ar[10]), making an array of pointers. To make a pointer to an array, you must use int (*ar)[10], as shown in your first declaration.

CodePudding user response:

you should use : Also you are using wrong syntex for sizeof.

// pointer to an array of five numbers
 int (* ar)[10] = NULL;

#include <stdio.h>
#include <stdlib.h>
#define SIZE 5

int main(){
    int *ar = malloc(sizeof(int) * SIZE);
    printf("%ld", sizeof(ar));
    return 0;
}
  • Related