Strange values in output when running newly compiled application

5

When I compile and run this code in Linux , it shows a strange result. I think it's rubbish from memory. What is happening to him to show this result, and how can I resolve it?

Command lines to compile code

gcc -c aluno.c
gcc -c test.c
gcc test.o aluno.o -o test.bin

Result

Studentfile.h

/*TAD:Aluno(matricula,nome,curso)*/typedefstructalunoAluno;/*Alocaeretornaumalunocomosdadospassadosporparâmetro*/Aluno*novo(intmatricula,char*nome,char*curso);/*Liberaamemóriadeumalunopreviamentecriado*/voidlibera(Aluno*aluno);/*Copiaosvaloresdeumalunoparaasreferênciasinformadas*/voidacessa(Aluno*aluno,int*matricula,char*nome,char*curso);/*Atribuinovosvaloresaoscamposdeumaluno*/voidatribui(Aluno*aluno,intmatricula,char*nome,char*curso);/*RetornaotamanhoembytesdoTADaluno*/intsize();

Studentfile

#include<stdio.h>#include<stdlib.h>#include<string.h>typedefstructaluno{intmatricula;charnome[50];charcurso[20];}Aluno;Aluno*novo(intmatricula,char*nome,char*curso){Aluno*a;a=malloc(sizeof(Aluno));a->matricula=matricula;strcpy(a->nome,nome);strcpy(a->curso,curso);}voidlibera(Aluno*aluno){free(aluno);}voidacessa(Aluno*aluno,int*matricula,char*nome,char*curso){matricula=(int*)&aluno->matricula;nome=(char*)&aluno->nome;curso=(char*)&aluno->curso;}voidatribui(Aluno*aluno,intmatricula,char*nome,char*curso){aluno->matricula=matricula;strcpy(aluno->nome,nome);strcpy(aluno->curso,curso);}intsize(){return(int)sizeof(Aluno);}

Test.cfile

intmain(){Aluno*a;a=malloc(sizeof(size()));a=novo(123,"victhor","computacao");

    int *matricula;
    char *nome, *curso;

    acessa(a,matricula,nome,curso);

    printf("Matrícula: %d\n",*matricula);
    printf("Nome: %s\n", nome);
    printf("Curso: %s\n", curso);
    return 0;
}
    
asked by anonymous 04.11.2016 / 22:54

1 answer

6

The code has several problems. Some are organizational and I did not solve them all. I would not use this acessa function, at least that way it is not being useful, maybe it will be changed later to be more useful. With the appropriate warnings attached and they should be linked to help find the problems, this code would not even compile.

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

typedef struct aluno {
    int matricula;
    char nome[50];
    char curso[20];
} Aluno;

Aluno *novo(int matricula, char *nome, char *curso) {
    Aluno *a = malloc(sizeof(Aluno)); // o ideal é receber o espaço já alocado
    a->matricula = matricula;
    strcpy(a->nome, nome);
    strcpy(a->curso, curso);
    return a; //não tinha return aqui
}

void libera(Aluno *aluno) {
    free(aluno);
}

void acessa(Aluno *aluno, int *matricula, char *nome, char *curso) {
    *matricula = aluno->matricula; //não estava jogando o dando em um ponteiro
    strcpy(nome, aluno->nome); //não estava copiando uma *string* para a outra
    strcpy(curso, aluno->curso);
}

void atribui(Aluno *aluno, int matricula, char *nome, char *curso) {
    aluno->matricula = matricula;
    strcpy(aluno->nome, nome);
    strcpy(aluno->curso, curso);
}

int size() {
    return (int)sizeof(Aluno);
}

int main() {
    Aluno *a = novo(123, "victhor", "computacao"); //simplifiquei e não aloquei de novo
    int matricula; //o dado não é um ponteiro
    char nome[50], curso[20]; //reserve o espaço para a *string*
    acessa(a, &matricula, nome, curso); //aqui manda o endereço da variável
    printf("Matrícula: %d\n", matricula);
    printf("Nome: %s\n", nome);
    printf("Curso: %s\n", curso);
}

See working on ideone and on CodingGround .

    
04.11.2016 / 23:28