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

fo_11

memoria dinâmica

Recommended Posts

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

Share this post


Link to post
Share on other sites
DVD

Será isto que queres?

int i;
char** g = (char**)malloc(4*sizeof(char*));
for(i = 0; i<4;++i) g[i] = (char*)malloc(100);

Share this post


Link to post
Share on other 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");
}

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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?

Share this post


Link to post
Share on other sites
fo_11

O programa deixa simplesmente de funcionar.

já experimentas te correr o programa?

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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

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.