Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

PsySc0rpi0n

alocação de memória ou fgets com problema

Recommended Posts

PsySc0rpi0n

Na sequência do post anterior, eu estava a tentar apenas testar uma possível divisãod e conteúdo em dois files, um .c e um .h...

O código apenas declara uma variável char*, depois existe uma função para alocar memória nessa variável, seguidamente uso o fgets para pedir uma string e guardá-la na variável criada!

Então no file .c apenas incluŕ o include de um file .h, a função main que declara a variável char*, chama a função que aloca memória, pede a string com o fgets e por fim mostra a string inserida na consola... No file .h, tenho os includes do stdio, string, stdlib e etc, tenho o cabeçalho da função que aloca memória, a definição da mesma função e um define ou outro... Nada mais... Resumindo:

main.c

include do file.h

função main com:

declaração da variável

chama a função de alocar memória

pede a string e mostra a string

main.h

include das libraries do costume, stdio, string, stdlib

defines necessários

cabeçalho da função de alocar memória

definição da função de alocar memória

Com esta estrutura, não consigo fazer o código funcionar e desconfio que o problema poderá estar na alocação de memória...

Aqui fica o code de cada file:

main.c

#include "main.h"
int main (int argc, char** argv){
   char* string = NULL;
   alloc_mem (string);
   fgets (string, BUFFER, stdin);
   if (string [strlen (string) - 1] == '\n')
  string [strlen (string) - 1] = '\0';
   printf ("The string is:%s\n", string);
   free (string);
   return 0;
}

main.h

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUFFER 256
void alloc_mem (char* input_string);
void alloc_mem (char* input_string){
   if ((input_string = malloc (BUFFER * sizeof (char))) == NULL){
    perror ("Memory error!");
    exit (0);
   }
}

No entanto se eu colocar o mesmo code todo no mesmo file, a coisa funciona bem:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define BUFFER 256
#define CLEAR_INPUT while (getchar () != '\n') /*void*/
int main (int argc, char** argv){
 char *string = NULL;
 if ((string = malloc (BUFFER * sizeof (char))) == NULL){
   perror ("Memory Error!");
   exit (0);
 }
 printf ("Insert string:\n");
 fgets (string, BUFFER, stdin);
 if (string [strlen (string) - 1] == '\n')
   string [strlen (string) - 1] = '\0';
 printf ("The string is %s!!!\n", string);
 free (string);
return 0;
}

Edited by PsySc0rpi0n

Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Share this post


Link to post
Share on other sites
HappyHippyHippo

lê a resposta ao outro tópico e saberás que o teu ficheiro main.h não faz sentido


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
PsySc0rpi0n

Entretanto já obtive ajuda do IRC e resolvi o problema. Quanto ao facto de o main.h não fazer sentido... Pois... Talvez, mas mesmo assim consigo usar o que disseste para que ele faça sentido, pelo menos no meu ponto de vista. Mas é precisamente isso que eu queria tentar perceber.

Pelo que li na outra thread, eu criei este main.h para que o code que está no main.c possa saber que, por exmeplo, a função alloc_mem existe, tal como os defines para os poder usar no file main.c sem ter que os lá ter...


Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Share this post


Link to post
Share on other sites
HappyHippyHippo

sim, mas o código dessa função nunca deveria estar no .h

razão ?

encore na única regra que disse no outro tópico caso faças uso desse .h noutro ficheiro .c


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
PsySc0rpi0n

sim, mas o código dessa função nunca deveria estar no .h

razão ?

encore na única regra que disse no outro tópico caso faças uso desse .h noutro ficheiro .c

Não percebi o "encore"...


Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.