Ir para o conteúdo
PsySc0rpi0n

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

Mensagens Recomendadas

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;
}

Editado por PsySc0rpi0n

Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.