Home > Blockchain >  how to allocate arrays (in array of pointers) C -- can it be done in one line? with malloc
how to allocate arrays (in array of pointers) C -- can it be done in one line? with malloc

Time:10-14

is there a simple one liner I can use in C to allocate arrays in (pointer of arrays)

This line creates 10 pointers of arrays

char *out[10];

I can't do this

char *out[100]=(char[10][100])malloc(sizeof(char)*10*100);

error: cast specifies array type

same error with

 char *out[10]=(char*[10])malloc(sizeof(char)*10*100);

do I need to do it in loop like this

int main()
{   
  
  
  char *out[10];
  int x=0;
  while(x<10)
  {
     *(out x)=malloc(sizeof(char)*100);// is this line correct?
      x  ;
  }
  *out[0]='x';
   printf("%c\n",out[0][0]);
   free(out);
   return 0;
}

but this cause warning that

req.c:75:3: warning: attempt to free a non-heap object ‘out’ [-Wfree-nonheap-object]
   75 |   free(out);

so do I need to allocate and free each array in (array of pointers) in loop

Can't I do allocation and free arrays in array of pointer in one line instead of loop?

or is there anything thing in my loop wrong too

CodePudding user response:

To allocate an array of pointers to strings, you need to do:

char** out = malloc(sizeof(char*[10]));

The whole point of using this form is that each pointer in that array of pointers can be allocated with individual size, as is common with strings. So it doesn't make sense to allocate such with a "one-liner", or you are using the wrong type for the task.

In case you don't need individual sizes but are rather looking for a char [10][100] 2D array with static size, then the correct way to allocate such is:

char (*out)[100] = malloc(sizeof(char[10][100]));

CodePudding user response:

You can allocate the full array in one single step and have pointers inside that array:

char *out[10];

data = malloc(100);   //sizeof(char) is 1 by definition
for (int x=0; x<10; x  ) {
    out[i] = data   x * 10;
}
*out[0] = 'x';
printf("%c\n",out[0][0]);
free(data);           // you must free what has been allocated

CodePudding user response:

int i;
char** out = (char**)malloc(sizeof(char*)*10);
for(i = 0; i<10;i  )
   out[i] = (char*)malloc(sizeof(char)*100);
out[1][1] = 'a';

OR with same dimensions

#include <stdio.h>
#include <stdlib.h>
 
void main()
{
    int r = 10, c = 100; //Taking number of Rows and Columns
    char *ptr, count = 0, i;
    ptr = (char*)malloc((r * c) * sizeof(char)); //Dynamically Allocating Memory
    for (i = 0; i < r * c; i  )
    {
        ptr[i] = i   1; //Giving value to the pointer and simultaneously printing it.
        printf("%c ", ptr[i]);
        if ((i   1) % c == 0)
        {
            printf("\n");
        }
    }
    free(ptr);
}
  •  Tags:  
  • c
  • Related