Struct address for INT

1

I have the following Struct:

struct nodo{
int elo_a;
char nick[26];
char cidade[16];
int idade;
int elo_p;};

I have two struct assignments:

struct nodo *variavel;
struct nodo *offline; 

Okay, I already inserted a value in offline, setting int elo_p and int elo_a to NULL, since it is the first element in a double-chained list. Now I enter values in the struct variable and I want to assign the memory address of it to the int elo_p of my first record of the struct offline, I did as offline->elo_p = variavel; but an error appears saying: invalid conversion from 'node * 'to int . I know I could solve the problem by changing the variable int elo_p to struct nodo *elo_p but I need to store the memory address inside int elo_p , is there anyway? Or am I doing something very wrong?

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

#define TAM 30

struct nodo{
    int elo_a;
    char nick[26];
    char cidade[16];
    int idade;
    int elo_p;
};
struct nodo *variavel; // troquei variavel estatica por dinamica
struct nodo  l_dupla[TAM]; //pnd

int top = TAM - 1;

void cria_pnd(void){ // codigo disponivel no trabalho *pnd*
     int i = 0;
     while(i < TAM-1){
           l_dupla[i].elo_p = ++ i;
     }
     l_dupla[TAM-1].elo_p = -1;
}

int pilha_pop(void){// função tirar da pnd
    if(top >= 0)
    return (-- top);

}

struct nodo pilha_push(void){// função inserir na pnd
    if(top>=0){
        return  l_dupla[top];
        top++;
    }else
        printf("Vazio ou nao existe nodo\n");

}

struct nodo retirada(void){
        struct nodo n;
        n = pilha_push();
        return n;
}

void inserir(struct nodo *offline, struct nodo *online,struct nodo *ignorados){
    int sw,indice;
    indice = pilha_pop();

    variavel = (struct nodo*) malloc(sizeof(struct nodo));

    printf("Escolha em qual lista deve ser incluido o usuario \n 1 - offline  2 - online  3 - ignorados \n" );
    scanf("%d",&sw);
    fflush(stdin);

    printf("Digite os valores para o usuario \n");
    printf("nick:\n");
    fflush(stdin);
    scanf("&s",variavel->nick);
    fflush(stdin);
    printf("cidade:\n");
    scanf("%s",variavel->cidade);
    fflush(stdin);
    printf("idade: \n");
    scanf("%d",variavel->idade);

    //inserir controle dos elos
    //inserir
    switch (sw){
        case 1:
            offline = (struct nodo*) malloc(sizeof(struct nodo));
            if(offline == NULL){
                offline = variavel;
                offline->elo_a = NULL;
                offline->elo_p = NULL;
            }else{
                offline->elo_p = variavel;
                variavel->elo_a = offline;

                offline = variavel;
                offline->elo_a = variavel->elo_a;
                offline->elo_p = NULL;
            }

            break;
        /*case 2:
        online = (struct nodo*) malloc(sizeof(struct nodo));
            online = &variavel;
          break;
        case 3:
            ignorados = (struct nodo*) malloc(sizeof(struct nodo));
            ignorados = &variavel;
            break;*/
        default:
            break;
   }
}
/*void mostar(void){
    int escolha = 0;
    printf("Digite a lista desejada: 1 - offline  2 - online  3 - ignorados:");
    scanf("%d",&escolha);

    switch (sw){
        case 1:

            break;
        case 2:
            online = &variavel;
          break;
        case 3:
            ignorados = &variavel;
            break;
        default:
            break;
   }
}*/

int main()
{
    struct nodo *offline = NULL;
    struct nodo *online = NULL;
    struct nodo *ignorados = NULL;
    char ch;
    cria_pnd();

    do{
        printf(" _____________________________________\n|\t\tmenu \t\t      |\n|_____________________________________|\n");
        printf("| I- incluir R- Retirada M - Mostar   |\n| T - troca de status D - Nodos disp  |\n|\t        S- Sair\t\t      |\n");
        printf("|_____________________________________|\n ");
        fflush(stdin); //PRECISA DE 2 FFLUSH
        scanf("%c",&ch);
        fflush(stdin); //PRECISA DE 2 FFLUSH

        switch (ch){
            case ('I'):
                inserir(offline,online,ignorados);
                break;
            case 'R':
               //variavel  =retirada();
                break;
            case 'M':
                //mostrar();
                break;
            case 'D':
                printf("Nodos disponiveis:%d",top+1);
            default:
                break;
        }
    }while(ch!='S');
    return 0;
}
    
asked by anonymous 07.11.2017 / 01:34

1 answer

1

The problem

The biggest problem of saving a ponteiro within a inteiro is that a ponteiro can be greater than inteiro , so you may not be able to access the memory region you want, since it lost some bytes of information when it passed ponteiro to within inteiro .

If you really need to store integer and addresses in the same variable, you can use long long instead of int and compile using the -fpermissive flag, but you will not be guaranteed that you will have a code that works for any architecture.

Implementation example

Below I'll show you an example code using this strategy you're looking for, but I'd better think of a more secure way to implement that code.

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

struct nodo{
    long long elo_a;
    char nick[26];
    char cidade[16];
    int idade;
    long long elo_p;
};

struct nodo *variavel;
struct nodo *offline;

int main() {
    // Alocando memória para offline
    offline = (struct nodo *) malloc(sizeof(struct nodo));

    // Alocando memória para variavel
    variavel = (struct nodo *) malloc(sizeof(struct nodo));

    // Adicionando um valor a idade de variavel
    variavel->idade = 23;

    // Colocando o endereço de variavel para offline->elo_p
    offline->elo_p = variavel;

    // Acessando o endereço de variavel
    struct nodo *aux = offline->elo_p;

    // 23
    printf("%d\n", aux->idade);

    return 0;
}

Compile as follows

gcc exemplo.cpp -fpermissive
    
07.11.2017 / 02:32