Ray Burns Ray Burns - 2 months ago 7
C Question

How do I correctly assign a struct containing an array of int to an array of struct?

I want to know how to assign a struct containing an array of int to an array of structs. I keep getting the incorrect result no matter what new solution I think of.

I believe the problem lies in this piece of code:

struct Codes *create(int as) {
struct Codes *c = malloc(sizeof (struct Codes)+as * sizeof (int));
c->as = as;
for (int i = 0; i < as; i++) {
c->a[i] = i;
}

return c;
}


The whole code:

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

struct Codes {
int as;
int a[];
};

struct Code {
int as;
struct Codes *ci[];
};

struct Codes *create(int as) {
struct Codes *c = malloc(sizeof (struct Codes)+as * sizeof (int));
c->as = as;
for (int i = 0; i < as; i++) {
c->a[i] = i;
}

return c;
}

struct Code *and(int as, struct Codes *cd) {
struct Code *c = malloc(sizeof (struct Code)+as * sizeof (struct Codes));
for (int i = 0; i < as; i++) {
c->ci[i] = cd;
}
c->as = as;
return c;
}

int main(int argc, char **argv) {

struct Codes *cd;
cd = create(4);

struct Code *c;
c = and(2, cd);

for (int i = 0; i < c->as; i += 1) {
for (int j=0; j < c->ci[i]->as; j++) {
printf("%d \n", c->ci[i]->a[j]);
}
}

free(cd);
free(c);

}//main


Actual Result:

0
1
2
3


Expected Result:

0
1
2
3
0
1
2
3

M.M M.M
Answer

struct Code *c = malloc(sizeof (struct Code)+as * sizeof (struct Codes)); is incorrect. The struct Code 's ci is an array of pointers , but you allocated space for an array of structs.

To fix this, either change to sizeof(struct Codes *), or preferably use the pattern of dereferencing the pointer to the type you're allocating space for:

struct Code *c = malloc( sizeof *c + as * sizeof c->ci[0] );

Also, for (int j; should be for (int j = 0; . Your code causes undefined behaviour by using uninitialized value of j, it's just chance that you happened to get the output you did. Using the gcc flag -Wextra would have diagnosed this error.