Pointer to a structure inside nested structures

I am trying to run the following code (in gcc 4.3 on fedora 11 i586):

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

struct s_smallstruct{
  int smallstruct;
};                      

struct s_test2{
        char * test2;
        struct s_smallstruct* smallstruct;
};

struct s_test3{
        char * test3;
        struct s_smallstruct * smallstruct;
};

struct s_test1{
        char * test1;
        struct s_test2 * test2;
        struct s_test3 * test3;
};


int main(){
        struct s_test1 *test1 = (struct s_test1 *) malloc( sizeof test1 );
        test1->test2[0].smallstruct[0].smallstruct = 123;
        int num = test1->test2[0].smallstruct[0].smallstruct;
//      struct s_smallstruct * smallstruct = (struct s_smallstruct *) malloc( sizeof smallstruct );
//      smallstruct[0].smallstruct =12;
//      int num =  smallstruct[0].smallstruct;
        printf( "%d\n" , num );
        return EXIT_SUCCESS;
}

But I got segfault in test1-> test2 [0] .smallstruct [0] .smallstruct = 123 ;, the commented part works without errors. What is the reason for this behavior. I do not really own C, so I would appreciate any help.

+3
source share
4 answers

There are three code issues that I see:

  • sizeof indicates only the size of the pointer, which is 4 for 32-bit pointers, not the size of the structure pointed to,
  • sizeof, , malloc s_test1, , ,
  • , , test1, test2 ..

:

const int length = 2;    
struct s_test1 *test1 = malloc( length * sizeof *test1 );
test1->test2 = malloc( length * sizeof *test1->test2 );
test1->test2->smallstruct = malloc( length * sizeof *test1->test2->smallstruct );
test1[1].test2[0].smallstruct[1].smallstruct = 123;
int num = test1[1].test2[0].smallstruct[1].smallstruct;
+7

:

struct s_test1 *test1 = (struct s_test1 *) malloc( sizeof test1 );

struct s_test1 *test1 = (struct s_test1 *) malloc( sizeof struct s_test1 );

test1 - , 32- 4 .

+1

- . sizeof (test1) 3 , .

, 5 (!) . , , - 5 .

+1

, , , @systemsfault, . , , . stackoverflow, , - , , . , ...

, , . -, , , (a1) (a2).

(b1) (b2) (a1) (a2). .

, :

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

struct s_smallstruct{
  int smallstruct;
};                      

struct s_test2{
  struct s_smallstruct *smallstruct;
};

struct s_test1{
  struct s_test2 *test2;
};

int main() {
  int i, j, length = 2;    

  struct s_test1 *test1 = malloc( length * sizeof *test1 );

  for (i=0; i<length; i++) {
    //test1[i].test2 = malloc( length * sizeof *test1->test2 );//(a1)
    test1[i].test2 = malloc( length * sizeof *test1[i].test2 );//(b1)

    for (j=0; j<length; j++) {
      //test1[i].test2[i].smallstruct = malloc( length * sizeof *test1->test2->smallstruct );//(a2)
      test1[i].test2[j].smallstruct = malloc( length * sizeof *test1[i].test2[j].smallstruct );//(b2)
    }
  }

  test1[1].test2[0].smallstruct[1].smallstruct = 123;
  int num = test1[1].test2[0].smallstruct[1].smallstruct;
  printf("num:%d\n", num);
  return 0;
}
0

Source: https://habr.com/ru/post/1713592/


All Articles