Ir para conteúdo
Fórum Script Brasil
  • 0

malloc


Guest janseN

Pergunta

Olá pessoal

Tenho um problema com um código que estou desenvolvendo... Vejam abaixo

typedef struct thread

{ int base;

int topo;

} thread;

void CriaThread(thread *atual, void (*f)(void))

{ printf("Estou em CriaThread!\n");

(*atual).topo = malloc(30*sizeof(int));

printf("Topo is %d\n",(*atual).topo);

(*atual).base = (*atual).topo + 30*sizeof(int);

printf("Base is %d\n",(*atual).base);

}

int main(void)

{

thread i;

CriaThread (&i,&hello);

}

O ponto é o seguinte. Em (*atual).topo eu tenho o endereço mais baixo da função malloc. Agora, eu quero ir acessando essas posições e atribuindo zero a elas desde a posição contida em (*atual).topo até a posição contida em (*atual).base.

Como eu faço essa indireção? Eu tentei por *( (*atual).topo ) = 0, &( (*atual).base ) = 0 e nada disso deu certo! Dava erro no gcc... Valeu! :D

Link para o comentário
Compartilhar em outros sites

1 resposta a esta questão

Posts Recomendados

  • 0

Alguns pontos:

1) Ao invés de fazer:

(*atual).topo
use:
atual->topo
Esta "setinha" é justamente um operador criado para não ter que fazer o que você está fazendo! Vai funcionar exatamente do mesmo jeito e o código fica mais limpo... 2) Se topo e base devem armazenar um endereço de memória então devem ser declarados como ponteiros. Assim a sua estrutura deve ser declarada como:
typedef struct thread
{
  int *base;
  int *topo;
} THREAD;
Obs.: eu coloquei o typedef em maiúsculo para diferenciar do nome da estrutura. Além disso esta prática deve ser evitada visto que ela abstrai o tipo e portanto torna o código mais difícil de entender. Procure sobre isto na inrernet que você irá ver bastante sobre isso, inclusive o kernel do linux mesmo não usa este recurso e fortemente pedem para que seja evitado! :) 3) Não entendi o que você está querendo exatamente. Você quer atribuir zero em todas as posições? Para isso use o código:
memset(atual->base, 0, 30);
memset(atual->topo, 0, 30);
Agora que eu percebi: você não está fazendo malloc para base! Desta forma você recervou apenas 30 int e depois falou para base usar mais 30 após esta posição? Você está acessando uma área de memória não alocada! Além disso vocÊ não está fazendo o casting ao alocar o topo. Use o seguinte código para alocar a memória:
atual->base = (int *)(malloc(30*sizeof(int)));
atual->topo = (int *)(malloc(30*sizeof(int)));

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,3k
×
×
  • Criar Novo...