What is the problem with my program?

2

I'm trying to better understand how pointers work in C and C ++ and for this I am trying to make this small list of linked lists (I took the example from the book "Data Structures" of the publisher Cengage Learning). I can not understand why my program has LAST other than FIM , both refer to the same value.

help pls!

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

typedef struct DataNodeHeader
{
    uintptr_t *inicio;
    uintptr_t *fim;
}DataNodeHeader;

typedef struct DataNode
{
    DataNodeHeader dnh;
    char data;
    int node_size;
    uintptr_t *next;
}DataNode;


int main(int argc, char *argv[])
{
    DataNode dn[5];

    const int def_size = (sizeof(dn) / sizeof(dn[0]) - 1); // TAMANHO FINAL DO DATANODE
    for (int i = 0; i <= def_size; i++)
    {
        dn[i].data = (char)i;
        dn[i].node_size = sizeof(dn[i]);
        dn[i].next = &dn[i + 1];

        if (i == 0)
        {
            dn->dnh.inicio = &dn[i];
            printf("FIRST: %p\n", &dn[i]);
        }

        printf("DATA:%d\n", dn[i].data);
        printf("NODE_SIZE: %d\n", dn[i].node_size);

        if (i != def_size)
            printf("NEXT:%p\n\n", dn[i].next);

        if(i == def_size)
        {
            dn->dnh.fim = &dn[i]; // dn[i].dnh.fim é atribuido com um ponteiro que aponta para &dn[i]
            printf("LAST:%p\n\n", &dn[i]);
        }
    }

    printf("INICIO:%p\n", &dn->dnh.inicio);
    printf("FIM:%p\n", &dn->dnh.fim);
    getchar();
    return 0;
}

Output:

FIRST: 00D3FBB0
DATA : 0
NODE_SIZE : 20
NEXT : 00D3FBC4

DATA : 1
NODE_SIZE : 20
NEXT : 00D3FBD8

DATA : 2
NODE_SIZE : 20
NEXT : 00D3FBEC

DATA : 3
NODE_SIZE : 20
NEXT : 00D3FC00

DATA : 4
NODE_SIZE : 20
LAST : 00D3FC00 <--- LAST REFERENCIADO NO TEXTO

INICIO : 00D3FBB0
FIM : 00D3FBB4 <---  FIM REFERENCIADO NO TEXTO
    
asked by anonymous 04.08.2016 / 07:30

1 answer

3
    printf("INICIO:%p\n", &dn->dnh.inicio);
    printf("FIM:%p\n", &dn->dnh.fim);

The values printed above are the addresses of dn->dnh.inicio and dn->dnh.fim . To print the content (the pointer value) uses

    printf("INICIO:%p\n", (void*)dn->dnh.inicio);
    printf("FIM:%p\n", (void*)dn->dnh.fim);
    
04.08.2016 / 12:25