RicardasSim icon

trying c structures

RicardasSim | PRO | 11/27/22 06:16:16 PM UTC (Edited) | 0 ⭐ | 1410 👁️ | Never ⏰ | [struct, sizeof]
C |

9.52 KB

|

None

|

0 👍

/

0 👎

//linux, 64bit, gcc, -Wall -Wextra -Wpedantic -Wshadow
 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
#define ST_STR_LEN 256
 
char first_str[] = "Andromeda";
char second_str[] = "Zeppelin";
 
struct st0 {
    char c;
    int i;
    float f;
    double d;
};
 
struct st1 {
    char c;
    int i;
    float f;
    double d;
} s1,s2;
 
typedef struct st2 {
    char c;
    int i;
    float f;
    double d;
} St2;
 
typedef struct {
    char c;
    int i;
    float f;
    double d;
} St3;
 
typedef struct {
    char c;
    char *p_str;
} St4;
 
typedef struct {
    char c;
    char str[ST_STR_LEN];
} St5;
 
typedef struct {
    char c;
    St3 s;
} St6;
 
typedef struct {
    char c;
    St3 s[14];
} St7;
 
typedef struct {
    char c;
    char ca[12];
} St8;
 
typedef struct {
 
    int a;
    int b __attribute__ ((packed));
    int c __attribute__ ((packed));
    int *p __attribute__ ((packed));
 
} S9;
 
typedef struct {
 
    int a;
    int b __attribute__ ((aligned (16)));
    int c __attribute__ ((aligned (16)));
    int *p __attribute__ ((aligned (16)));
 
} S10;
 
int main()
{
 
    struct st0 s0;
 
    s0.c = 'o';
    s0.i = 1;
    s0.f = 1.2f;
    s0.d = 12.1;
 
    printf( "s0.c: %c\n", s0.c );
    printf( "s0.i: %d\n", s0.i );
    printf( "s0.f: %f\n", s0.f );
    printf( "s0.d: %f\n\n", s0.d );
 
    s1.c = 'a';
    s1.i = 123;
    s1.f = 1.23f;
    s1.d = 12.3;
 
    printf( "s1.c: %c\n", s1.c );
    printf( "s1.i: %d\n", s1.i );
    printf( "s1.f: %f\n", s1.f );
    printf( "s1.d: %f\n\n", s1.d );
 
    s2 = s1;
 
    printf( "s2.c: %c\n", s2.c );
    printf( "s2.i: %d\n", s2.i );
    printf( "s2.f: %f\n", s2.f );
    printf( "s2.d: %f\n\n", s2.d );
 
    printf( "sizeof (struct st1): %zu\n", sizeof (struct st1) );
    printf( "sizeof s2: %zu\n", sizeof s2 );
    printf( "sizeof &s2: %zu\n", sizeof &s2 );
    printf( "sizeof s2.c: %zu\n", sizeof s2.c );
    printf( "sizeof s2.i: %zu\n", sizeof s2.i );
    printf( "sizeof s2.f: %zu\n", sizeof s2.f );
    printf( "sizeof s2.d: %zu\n\n", sizeof s2.d );
 
    struct st1 *p_s3;
 
    p_s3 = &s1;
 
    printf( "p_s3.c: %c\n", p_s3->c );
    printf( "p_s3.i: %d\n", p_s3->i );
    printf( "p_s3.f: %f\n", p_s3->f );
    printf( "p_s3.d: %f\n", p_s3->d );
    printf( "sizeof p_s3: %zu\n", sizeof p_s3 );
    printf( "sizeof &p_s3: %zu\n", sizeof &p_s3 );
    printf( "sizeof *p_s3: %zu\n", sizeof *p_s3 );
    printf( "sizeof p_s3.c: %zu\n", sizeof p_s3->c );
    printf( "sizeof p_s3.i: %zu\n", sizeof p_s3->i );
    printf( "sizeof p_s3.f: %zu\n", sizeof p_s3->f );
    printf( "sizeof p_s3.d: %zu\n", sizeof p_s3->d );
    printf( "&s1: %p\n", (void *) &s1 );
    printf( "p_s3: %p\n", (void *) p_s3 );
    printf( "&p_s3: %p\n", (void *) &p_s3 );
    printf( "HEX: p_s3: %#lx\n\n", (long unsigned int) p_s3 );
 
    printf("s1 before:\n\n");
 
    printf( "s1.c: %c\n", s1.c );
    printf( "s1.i: %d\n", s1.i );
    printf( "s1.f: %f\n", s1.f );
    printf( "s1.d: %f\n\n", s1.d );
 
    p_s3->c = 'b';
    p_s3->i = 321;
    p_s3->f = 3.21f;
    p_s3->d = 32.1;
 
    printf("s1 after:\n\n");
 
    printf( "s1.c: %c\n", s1.c );
    printf( "s1.i: %d\n", s1.i );
    printf( "s1.f: %f\n", s1.f );
    printf( "s1.d: %f\n\n", s1.d );
 
 
    struct st2 test_s_1;
 
    test_s_1.c = 'c';
    test_s_1.i = 22;
    test_s_1.f = 2.2f;
    test_s_1.d = 22.0;
 
    printf( "test_s_1.c: %c\n", test_s_1.c );
    printf( "test_s_1.i: %d\n", test_s_1.i );
    printf( "test_s_1.f: %f\n", test_s_1.f );
    printf( "test_s_1.d: %f\n\n", test_s_1.d );
 
    St2 test_s_2;
 
    test_s_2.c = 'd';
    test_s_2.i = 222;
    test_s_2.f = 2.22f;
    test_s_2.d = 222.0;
 
    printf( "test_s_2.c: %c\n", test_s_2.c );
    printf( "test_s_2.i: %d\n", test_s_2.i );
    printf( "test_s_2.f: %f\n", test_s_2.f );
    printf( "test_s_2.d: %f\n\n", test_s_2.d );
 
    St3 test_s_3;
 
    test_s_3.c = 'd';
    test_s_3.i = 333;
    test_s_3.f = 3.33f;
    test_s_3.d = 333.0;
 
    printf( "test_s_3.c: %c\n", test_s_3.c );
    printf( "test_s_3.i: %d\n", test_s_3.i );
    printf( "test_s_3.f: %f\n", test_s_3.f );
    printf( "test_s_3.d: %f\n\n", test_s_3.d );
 
    St3 *p_s_3;
 
    p_s_3 = malloc( sizeof p_s_3 );
 
    if ( !p_s_3 )
    {
        printf("Error: cannot allocate memory.\n");
    }
    else
    {
        p_s_3->c = 'e';
        p_s_3->i = 111;
        p_s_3->f = 1.11f;
        p_s_3->d = 111.0;
 
        printf( "p_s_3->c: %c\n", p_s_3->c );
        printf( "p_s_3->i: %d\n", p_s_3->i );
        printf( "p_s_3->f: %f\n", p_s_3->f );
        printf( "p_s_3->d: %f\n\n", p_s_3->d );
 
        free( p_s_3 );
    }
 
    St4 s4;
 
    s4.c = 'f';
    s4.p_str = first_str;
 
    printf( "s4.c: %c\n", s4.c );
    printf( "s4.p_str: %s\n\n", s4.p_str );
 
    St4 s4a;
 
    s4a = s4;
 
    printf( "s4a.c: %c\n", s4a.c );
    printf( "s4a.p_str: %s\n\n", s4a.p_str );
 
    s4.p_str = second_str;
 
    printf( "(2) s4.c: %c\n", s4.c );
    printf( "(2) s4.p_str: %s\n\n", s4.p_str );
 
    printf( "(2) s4a.c: %c\n", s4a.c );
    printf( "(2) s4a.p_str: %s\n\n", s4a.p_str );
 
    St5 s5 = {0};
 
    s5.c = 'g';
 
    if ( strlen(first_str) < ST_STR_LEN - 1 )
    {
        printf("\"%s\", length: %ld\n\n", first_str, strlen(first_str));
        strcpy( s5.str, first_str );
    }
    else
    {
        printf("Error: first string too long.\n");
    }
 
    printf( "(1) s5.c: %c\n", s5.c );
    printf( "(1) s5.str: %s\n\n", s5.str );
 
    if ( strlen(second_str) < ST_STR_LEN - 1 )
    {
        printf("\"%s\", length: %ld\n\n", second_str, strlen(second_str));
        strcpy( s5.str, second_str );
    }
    else
    {
        printf("Error: second string too long.\n");
    }
 
    printf( "(2) s5.c: %c\n", s5.c );
    printf( "(2) s5.str: %s\n\n", s5.str );
 
    St5 s5a = { .c = 'h', .str = "Orion" };
 
    printf( "s5a.c: %c\n", s5a.c );
    printf( "s5a.str: %s\n\n", s5a.str );
 
    St5 s5b = { .str = "Capricorn", .c = 'r' };
 
    printf( "s5b.c: %c\n", s5b.c );
    printf( "s5b.str: %s\n\n", s5b.str );
 
    St6 s6;
 
    printf( "sizeof s6: %zu\n", sizeof s6 );
    printf( "sizeof &s6: %zu\n", sizeof &s6 );
    printf( "sizeof s6.c: %zu\n", sizeof s6.c );
    printf( "sizeof s6.s: %zu\n\n", sizeof s6.s );
 
    s6.s.c = 'j';
 
    printf( "s6.s.c: %c\n\n", s6.s.c );
 
    St7 s7;
 
    printf( "sizeof s7: %zu\n", sizeof s7 );
    printf( "sizeof &s7: %zu\n", sizeof &s7 );
    printf( "sizeof s7.c: %zu\n", sizeof s7.c );
    printf( "sizeof s7.s: %zu\n\n", sizeof s7.s );
 
    s7.s[0].c = 'k';
    s7.s[1].c = 'l';
 
    printf( "s7.s[0].c: %c\n", s7.s[0].c );
    printf( "s7.s[1].c: %c\n\n", s7.s[1].c );
 
    St8 s8;
 
    printf( "sizeof s8: %zu\n", sizeof s8 );
    printf( "sizeof &s8: %zu\n", sizeof &s8 );
    printf( "sizeof s8.c: %zu\n", sizeof s8.c );
    printf( "sizeof s8.ca: %zu\n\n", sizeof s8.ca );
 
    s8.ca[0] = 'm';
    s8.ca[1] = 'n';
 
    printf( "s8.ca[0]: %c\n", s8.ca[0] );
    printf( "s8.ca[1]: %c\n\n", s8.ca[1] );
 
    S9 strc_9;
 
    S9 strc_9a[10];
 
    S10 strc_10;
 
    S10 strc_10a[10];
 
    printf("sizeof (S9): %zu\n", sizeof (S9));
    printf("sizeof strc_9: %zu\n", sizeof strc_9);
    printf("sizeof strc_9a: %zu\n", sizeof strc_9a);
    printf("sizeof *strc_9a: %zu\n", sizeof *strc_9a);
    printf("sizeof strc_9a[0]: %zu\n\n", sizeof strc_9a[0]);
 
    printf("sizeof (S10): %zu\n", sizeof (S10));
    printf("sizeof strc_10: %zu\n", sizeof strc_10);
    printf("sizeof strc_10a: %zu\n", sizeof strc_10a);
    printf("sizeof *strc_10a: %zu\n", sizeof *strc_10a);
    printf("sizeof strc_10a[0]: %zu\n\n", sizeof strc_10a[0]);
 
    return 0;
}
 
/*
output:
 
s0.c: o
s0.i: 1
s0.f: 1.200000
s0.d: 12.100000
 
s1.c: a
s1.i: 123
s1.f: 1.230000
s1.d: 12.300000
 
s2.c: a
s2.i: 123
s2.f: 1.230000
s2.d: 12.300000
 
sizeof (struct st1): 24
sizeof s2: 24
sizeof &s2: 8
sizeof s2.c: 1
sizeof s2.i: 4
sizeof s2.f: 4
sizeof s2.d: 8
 
p_s3.c: a
p_s3.i: 123
p_s3.f: 1.230000
p_s3.d: 12.300000
sizeof p_s3: 8
sizeof &p_s3: 8
sizeof *p_s3: 24
sizeof p_s3.c: 1
sizeof p_s3.i: 4
sizeof p_s3.f: 4
sizeof p_s3.d: 8
&s1: 0x555ef2857040
p_s3: 0x555ef2857040
&p_s3: 0x7ffc5cdffac0
HEX: p_s3: 0x555ef2857040
 
s1 before:
 
s1.c: a
s1.i: 123
s1.f: 1.230000
s1.d: 12.300000
 
s1 after:
 
s1.c: b
s1.i: 321
s1.f: 3.210000
s1.d: 32.100000
 
test_s_1.c: c
test_s_1.i: 22
test_s_1.f: 2.200000
test_s_1.d: 22.000000
 
test_s_2.c: d
test_s_2.i: 222
test_s_2.f: 2.220000
test_s_2.d: 222.000000
 
test_s_3.c: d
test_s_3.i: 333
test_s_3.f: 3.330000
test_s_3.d: 333.000000
 
p_s_3->c: e
p_s_3->i: 111
p_s_3->f: 1.110000
p_s_3->d: 111.000000
 
s4.c: f
s4.p_str: Andromeda
 
s4a.c: f
s4a.p_str: Andromeda
 
(2) s4.c: f
(2) s4.p_str: Zeppelin
 
(2) s4a.c: f
(2) s4a.p_str: Andromeda
 
"Andromeda", length: 9
 
(1) s5.c: g
(1) s5.str: Andromeda
 
"Zeppelin", length: 8
 
(2) s5.c: g
(2) s5.str: Zeppelin
 
s5a.c: h
s5a.str: Orion
 
s5b.c: r
s5b.str: Capricorn
 
sizeof s6: 32
sizeof &s6: 8
sizeof s6.c: 1
sizeof s6.s: 24
 
s6.s.c: j
 
sizeof s7: 344
sizeof &s7: 8
sizeof s7.c: 1
sizeof s7.s: 336
 
s7.s[0].c: k
s7.s[1].c: l
 
sizeof s8: 13
sizeof &s8: 8
sizeof s8.c: 1
sizeof s8.ca: 12
 
s8.ca[0]: m
s8.ca[1]: n
 
sizeof (S9): 20
sizeof strc_9: 20
sizeof strc_9a: 200
sizeof *strc_9a: 20
sizeof strc_9a[0]: 20
 
sizeof (S10): 64
sizeof strc_10: 64
sizeof strc_10a: 640
sizeof *strc_10a: 64
sizeof strc_10a[0]: 64
 
*/
 

Comments