Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

fo_11

memoria dinâmica

Mensagens Recomendadas

fo_11

É um programa com um objectivo muito simples.

Tenh esta variavel *v[100] e quero que ela vá contendo o que escrevo.

Exemplo:

Hello world. e guardo numa posição do vector *v[100];

Olá mundo. e guardo na posição a seguir do vector *v[100];

Tenh quatro linhas para escrever mas não posso usar uma variavel deste tipo v[4][100] tem mesmo de ser *v[100].

Como resolvo esse problema.

Aqui está o programa elaborado por mim mas quand é para imprimir no ecrã a informação guardada dá erro

#include<stdio.h>
#include<stdlib.h>
void name(char [][100]);

int main()
{
    char *g[100];
    int dim=0,i;
    
    while(dim<5)
     {printf("Inserir:");
     ++dim;
      *g=(char*)malloc(dim*sizeof(char));
      scanf("%s",&g[dim-1]);
      
     }
     
     for(i=0;i<dim;i++)//não sei o que se passa mas não consigo aceder ao seu conteudo (g);
       printf(" %s",g[i]);
     system("pause");
}

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
fo_11

O programa ficou assim que é basicamente como disseste só que ficou com um while.

Séra que podes explicar esta parte scanf("%s",&(*g[dim])); ?

O programa:

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


int main()
{
    char **g;
    int dim=0,i;
    g=(char**)malloc(4*sizeof(char*));
    
    while(dim<5)
     {printf("Inserir:");
       
      g[dim]=(char*)malloc(100);
      scanf("%s",&(*g[dim]));
      ++dim;
     }
     
     for(i=0;i<dim;i++)
       printf(" %s",g[i]);
     system("pause");
}

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pedrosorio

Assim não funciona...

Acho que ele queria dizer "g[dim]".

g é um array de arrays de caracteres. Por outras palavras, é um array de strings. g[dim] corresponde à string nº dim, e é um apontador para caracteres que aponta para o primeiro caracter desta string. É isso que deves colocar no segundo argumento do scanf.

Nota: Obviamente que, como * te dá o valor apontado por, e & te dá o endereço de memória correspondente, ter "&(*qualquercoisa))" é igual a "qualquercoisa" daí que o teu código funcione.


Não respondo a dúvidas por mensagem.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Localhost

g[dim] é um ponteiro ou seja, nunca se pode fazer &g[dim] porque g[dim] já contêm um endereço. Tem de se seguir o que o pedrosorio disse, colocar apenas g[dim].

Isto é exactamente o mesmo que fazer isto:

int k = 0;
int *ptK = &k;
scanf("%i", ptK);

Temos o endereço num ponteiro e passámos esse endereço para afectar a variável apontada pelo ponteiro.


here since 2009

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
fo_11

ok, já percebi o pk... mas simplesmente dá erro se fizer como estão a dizer...

Experimentem e digam qualquer coisa se faz favor

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
DVD

sim ta correcto simplesmente copiei nem tomei atenção xDD

De qualquer a maneira quando fazes &(g[dim]) tás a ir buscar o endereço do pointer e não o endereço do apontado.

(simpleficando o que ja foi dito)

EDIT: que erro?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pedrosorio

O programa deixa simplesmente de funcionar.

já experimentas te correr o programa?

O problema está no facto de alocares em g memória para 4 strings e em seguida tentares definir, no ciclo while, 5 strings.


Não respondo a dúvidas por mensagem.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
fo_11

Sim, tens razão... Já estava a programar a algum que esse simples pormenores já me estavam a passar ao lado.

Obrigado

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.