Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

jadsonlucena

struct aninhada onde o ponteiro de dentro seria um array dinâmico

Recommended Posts

#include <iostream>
#include <cstdlib>

using namespace std;


struct Page {
	int a;
	Page* b;
};


int main(int argc, char *argv[]) {
	
	int size = 5;
	
	Page* p = (Page*) malloc(sizeof(Page));
	p->a = 5;
	p->b = (Page*) malloc(sizeof(Page) * size);
	
	for (int i = 0; i < size; i++) {
		
		p->b[i] = NULL;
		
	}
	
	cout << p->b[3] << endl;	
	
	
	return 0;
}

A ideia era criar uma página onde dentro teríamos um array de páginas inicialmente nulas. Mas por algum motivo eu não estou conseguindo criar o array interno. Pois quando tento instanciar o valor nulo para as células do array, o compilador informa que não é um array e não pode acessar.

 

Antes de qualquer coisa, realmente necessito que seja uma alocação dinâmica.

 

Grato desde já pela ajuda... 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olha, faz tempo que não mexo com ponteiros, mas...

Quando você faz 

p->b = (Page*) malloc(sizeof(Page) * size);



você está alocando um bloco com tamanho (sizeof(Page) * size) em bytes. Se não me falhe a memória, não tem como você escrever em partes nesse bloco.

Se você fizer o código deste jeito a coisa fica parecendo uma lista ligada (um array dinâmico, mas não interno à struct):


#include <iostream>
#include <cstdlib>

using namespace std;

struct Page {
    int a;
    struct Page * b;
};


int main(int argc, char *argv[]) {
    
    int size = 5;
    
    struct Page * p = (struct Page *) malloc(sizeof(struct Page));
    
    p->a = 5;
    
    p->b = (struct Page *) malloc(sizeof(struct Page));
  (p->b)->a = 10;
  (p->b)->b = (struct Page *) malloc(sizeof(struct Page));
  (p->b)->b = NULL; // FIM DA LISTA;
    
    cout <<p->a << endl;
    cout << (p->b)->a << endl;
    cout << (p->b)->b << endl;
    
    
    return 0;
}



Note que cada struct aponta *somente* para o próximo elemento, não para um lugar em memória que conteria 10.

Se você escrever o código dessa forma você tem o array dinâmico associado à página:

 

#include <iostream>
#include <cstdlib>

using namespace std;

struct Page {
    int a;
    struct Page ** b;
};


int main(int argc, char *argv[]) {
    
    int size = 5;
    struct Page p;
    
  p.a = 1;
  p.b = (struct Page **) malloc(sizeof(struct Page *) * size);

  
  for(int i = 0; i<size; i++) {
    (p.b[i]) = (struct Page *) malloc(sizeof(struct Page));
    (p.b[i])->a = i*(-1);
    (p.b[i])->b = NULL;
  }
  
  printf("endereço de p.b: %x\n", &(p.b));
  printf("conteúdo de p.b (endereço de memória): %x\n", *(p.b));
  
  printf("Conteúdo do endereço em p.b:\n");
  for(int i=0; i<size; i++) {
    printf("Endereço de memória: %x, valor (a): %d, Endereço do ponteiro aninhado (b): %x\n", &(p.b[i]), (p.b[i])->a, (p.b[i])->b);
  }
    return 0;
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por joaquim_bezzera
      Estou fazendo um trabalho para a faculdade criando uma estrutura de cadastro de uma corrida. Já consegui fazer grande parte mas não consigo resolver esses pontos. Alguém saberia resolver?

    • Por Doloblan
      Peguei esse codigo da internet, e estou tentando modificar ele para ficar do jeito que preciso, peguei ele sem funcao e preciso de funcao para cada acao e apos criar a funcao de cadastro apenas para teste nao salva a variavel no arquivo binario.
      #include <stdio.h>
      #include <stdlib.h>
      #include <string.h>
      struct Contato{
        char nome[100];
        int  telefone;
      };
      struct Contato *agenda;
      FILE *fp;
      int cadastra(int n, int cap){
          fp = fopen("xxx.dat","a+b");
          if(n == cap){
              cap *= 2;
              agenda = realloc(agenda, sizeof(struct Contato)*cap);
          }
          printf("Digite o nome: ");
          scanf(" %[^\n]", agenda[n].nome);
          printf("Digite o telefone: ");
          scanf("%d", &agenda[n].telefone);
          fwrite(agenda, sizeof(struct Contato), n, fp);
          fclose(fp);
          return n++;
      }
      int main(){
          int cap; 
          int n;  
          int opc; 
          int i;
          struct Contato *agenda;
          FILE *fp;
          
          fp = fopen("xxx.dat","rb");
          printf("N; %d \n", n);
          if(fp==NULL){
              n = 0; 
              cap = 20; 
              agenda = (struct Contato *)malloc(sizeof(struct Contato)*cap);
          }
          else{ 
              fread(&n, sizeof(int), 1, fp);
              cap = n*2; 
              agenda = (struct Contato *)malloc(sizeof(struct Contato)*cap);
              fread(agenda, sizeof(struct Contato), n, fp);
              fclose(fp);
          }
        
          do{
              printf("*** Menu ***\n");
              printf("1) Cadastrar contato.\n");
              printf("2) Exibir contatos.\n");
              printf("3) Apagar.\n");
              printf("4) Sair.\n");
              scanf("%d",&opc);
              switch(opc){
                     case 1:
                         printf("n %d\n", n);
                         n = cadastra(n, cap);
                         printf("n %d\n", n);
                  break;
              }
          if(opc==2){
              for(i=1; i<4; i++){
                  printf("*** Contato %d ***\n",i+1);
                  printf("Nome: %s\n",agenda.nome);
                  printf("Telefone: %d\n",agenda.telefone);
              }
              printf("N; %d \n", n);
          }
          else if(opc==3){
              char nome[100];
              int j;
              scanf("%s",&nome);
              for(i=0; i<n; i++){
                  if (strcmp(agenda.nome, nome)==0){
                      for(j=i+1; j<n; j++){
                              strcpy(agenda[j-1].nome,agenda[j].nome);
                              agenda[j-1].telefone=agenda[j].telefone;
                      }
                  n--;
                  i=n;
                  }
              }
          }
          }while(opc!=4); 
          
          if(n>0){
          fp = fopen("xxx.dat","wb");
          fwrite(&n, sizeof(int), 1, fp);
          fwrite(agenda, sizeof(struct Contato), n, fp);
          fclose(fp);
          }
          free(agenda);
        
        return 0;
      }
    • Por marciniak
      Salve!
      Estou tentando escrever em uma string (ponteiro alocado dinamicamente) através de uma função alimentada por um ponteiro
      Codigo de exemplo:
      #include <stdio.h> #include <stdlib.h> #include <string.h> void teste (char *str) { str = (char*)malloc(sizeof(char)*(strlen("teste"))); strcpy(str, "teste"); printf("%s", str); } int main() { char *str1 = NULL; teste(str1); printf("|%s", str1); return 0; }  
      A intenção é que a saída seja algo do tipo:
      teste|teste porém o resultado é:
      teste|(null)  
      Acredito que por estar enviando como referência o str1 ele deveria ser alterado pela função, e portanto permanecer como o mesmo valor de str (que aponta para ele), porém isso não acontece.
      Como deveria proceder para conseguir o resultado desejado?

      Agradeço!
    • Por luannsr12
      Olá pessoal, parece que o meu Photoshop atualizou aqui, pois apareceu algumas ferramentas que eu não tinha visto, e também sumiu o ponteiro do seletor , alguém pode me ajudar
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.