Ir para conteúdo
ESMA

Bug em programa alocação dinâmica de vetores

Recommended Posts

Pessoal, vocês podem me ajudar a corrigir o bug?

"Faça um programa em C++ que leia números do teclado e os armazene em um vetor alocado dinamicamente. O usuário irá digitar uma sequência de números, sem limite de quantidade. Os números serão digitados um a um e, sendo que caso ele deseje encerrar a entrada de dados, ele irá digitar o número ZERO. Os dados devem ser armazenados na memoria deste modo."

Eu fiz esse código, mas ele buga quando digito 0:

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

int main () {

    int *vet;
    int j, n = 0;

    vet = (int *)malloc(1 * sizeof(int));

    while (vet != 0) {
        printf("\nDigite um número: ");
        scanf("%i",&vet);
        n++;
    }

    for (j = 1; j < n; j++) {
        printf("%i ",vet[j]);
    }
    printf("\n");
    return 0;
    free(vet);
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Amigo, esta muito errado.

1- vet é um endereço de memoria, comparar ele com o decimal zero, seria como comparar ele com NULL e nao é o que você quer, substitua.

- vet != 0 por *vet != 0

Desrefencie antes de comparar.

2-Voce esta alocando 1*sizeof(int), ou seja, 4 bytes para armazer um inteiro, e você coloca isso dentro de um laço onde a condição de parada é dada pelo usuario, você precisa realocar o espaço dentro do loop, oq eu te recomendo é o seguinte, por malloc ser uma operação mto custoza, aloca inicialmente um espaço maior como - 100*sizeof(int)-, e se o seu n passar de 99 você da um realloc em mais 100 espaços.

3- Por vet ser um ponteiro, e scanf esperar um ponteiro para guardar o valor inserido pelo usuario, a intrução "...&vet" nao faz sentido, ja q o & serve para pegar o endereço de algo na memoria, voce esta pegando o endereço de um endereço, vai gerar erros sutis, se você quer usar o & entao faça "...&vet[n]" ou para nao usar o & você usa o vet solto, "...vet);" mas nesse ultima caso você precisa incrementar o ponteiro com vet++, e nao se eskeca de salvar a posição inicial do ponteiro se for seguir por este ultimo caminho.

4- você usa um while(*vet != 0), sem inicializar vet, entao se por um acaso o lixo de memoria q esta la quando você alocou o espaço for igual a 0, o laço nunca vai acontecer, use ou um do/while, ou inicialize valores para o endereço para evitar este erro.

5-Nao tem pq j começar em 1, e se você optar por usar um do/while é necessario q seja usado j<n-1, ja q ele vai passar pelo while uma vez a mais no 0

6- O seu free esta abaixo do return, é um erro comum, o return do main encerra o programa, logo sua memoria nunca sera liberada, coloque-a uma linha acima

Acho q é isso, segue o codigo corrigido,

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

int main () {

    int *vet;
    int size = 1;
    int j, n = 0;

    vet = (int*)malloc(size * 100 * sizeof(int));

    do
    {
        printf("Digite um numero:\n");
        scanf("%d", &vet[n]);
	n++;
		
	if(n / 100 == size)
	{
	   size++;
	   realloc(vet, size * 100 * sizeof(int));
	}
    }while(vet[n-1]);

    for (j = 0; j < n-1; j++) 
    {
        printf("%d ", vet[j]);
    }
	
    printf("\n");
    free(vet);
	
    return 0;
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Os dois programas acima estão usando a biblioteca string.h mesmo não fazendo nenhuma chamada de função à ela. É desnecessário. A linha de código #include<string.h> pode ser removida por que linhas de código desnecessárias como essa apenas fazem com que o código-fonte fique sujo e poluído. Isso que eu digo é chamado de "limpar o código". É tirar o que não serve e deixar somente o que o programa necessita. Abaixo o programa funcionando: 

#include<iostream.h>

struct no_num{
  int num;
  no_num *prox;
}; 

int main(){
  no_num *primeiro=new(no_num);
  no_num *ultimo=primeiro;
  int num=1;
  while(num!=0){    
    cout << "Digite algum numero. 0 para parar:"; 
    cin >> num;
    ultimo->num=num;
    ultimo->prox=new(no_num);
    ultimo=ultimo->prox;
    ultimo->prox=NULL;
  }
  cout << endl << "Numeros digitados:";   
  for(no_num *temp=primeiro;temp->prox->prox!=NULL;temp=temp->prox)
    cout << endl << temp->num;
  
  system("pause");
}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora

  • Conteúdo Similar

    • Por JonasFloripa
      Bom dia pessoal..
      Estou com um problema e apareceu quando migrei o sistema ue tenho do php5 para o php7.
      Essa parte do sistema que está dando o problema seria quando quero adicionar o nome do pessoal em uma escala, mas quando seleciono os nomes partindo de quem começa com  a letra 'R', não envia as infomarções. Isso não acontecia no php5.
      Vou colocar o código abaixo e o que mostra quando seleciono o checkbox.
       
       
      <table width="100%" border="0" cellpadding="1" cellspacing="1"> <tr> <td width="9%" align="center"> <input name="conf[]" type="checkbox" value="<?PHP echo $login; ?>"/> </td> <td width="21%"><input name="login_<?PHP echo $login;?>" type="text" value="<?PHP echo $login; ?>" readonly class="negrito"/></td> <td width="13%"><input name="hora2_<?PHP echo $login;?>" type="text" value="<?PHP echo $hora2; ?>" size="4" readonly class="negrito"/></td> <td width="13%"><input name="somah2_<?PHP echo $login;?>" type="text" value="<?PHP echo $somah2; ?>" size="4"readonly="readonly" class="negrito"/></td> <td width="13%"><input name="quantidade_<?PHP echo $login;?>" type="text" value="<?PHP echo $total2; ?>" size="4"readonly="readonly" class="negrito"/></td> <td width="16%"><input name="data_<?PHP echo $login;?>" type="text" value="<?PHP echo $data; ?>" size="10" readonly class="negrito"/></td> <td width="15%"><input name="idescala_<?PHP echo $login;?>" type="text" value="<?PHP echo $idescala; ?>" size="5" readonly class="negrito"/></td> </tr> </table>  
    • Por Sharank
      Strcat Function In C++
       
      I'm new to C and C++ programming, can anyone give me a hint on what I'm doing wrong here. I'm trying to write to concat function that takes to pointers to chars and concatenates the second to the first. The code does do that, but the problem is that it adds a bunch of junk at the end.
       
      For instance, when passing the arguments - "green" and "blue", the output will be "greenblue" plus a bunch of random characters. I also wrote the strlen function that strcat uses, which I will provide below it for reference. I'm using the online compiler at InterviewBit The exact instructions and specification is this:
       
      int main(int argc, char** argv)
      {
      const int MAX = 100;
       
      char s1[MAX];
      char s2[MAX];
       
      cout << "Enter your first string up to 99 characters. ";
      cin.getline(s1, sizeof(s1));
      int size_s1 = strlen(s1);
      cout << "Length of first string is " << size_s1 << "\n";
       
      cout << "Enter your second string up to 99 characters. ";
      cin.getline(s2, sizeof(s2));
      int size_s2 = strlen(s2);
      cout << "Length of second string is " << size_s2 << "\n";
      cout << " Now the first string will be concatenated with the second
      string ";
      char* a = strcat(s1,s2);
       
      for(int i = 0; i<MAX; i++)
      cout <<a;
       
      // system("pause");
      return 0;
      }
       
      //strcat function to contatenate two strings
      char* strcat(char *__s1, const char *__s2)
      {
      int indexOfs1 = strlen(__s1);
      int s2L = strlen(__s2);
      cout <<s2L << "\n";
      int indexOfs2 = 0;
      do{
      __s1[indexOfs1] = __s2[indexOfs2];
      indexOfs1++;
      indexOfs2++;
      }while(indexOfs2 < s2L);
       
       
      return __s1;
      }
       
      //Returns length of char array
      size_t strlen(const char *__s)
      {
      int count = 0;
      int i;
      for (i = 0; __s != '\0'; i++)
      count++;
      return (count) / sizeof(__s[0]);
       
      }
    • Por roberson abalaid
      #include <stdio.h>
      #include <stdlib.h>
      int arr[3][5];
      int main(){
          
          printf("Favor inserir os dados...\n");
          
          for(int i = 0; i < 3; i++){
              for(int j = 0; j < 5; j++){
                  scanf("%d", &arr[j]);
              }
          }
          
            printf("os valores inseridos foram...\n");
          
          for(int i = 0; i < 3; i++){
              for(int j = 0; j < 5; j++){
                  printf("  %d  ", arr[j]);
              }
              printf("\n");
          }
          return 0;
      }
    • Por ph1
      boolean opcao = false; // tem que inicializar com true dentro do laço 'do-while' String resp; Scanner sc = new Scanner(System.in); do { // essas duas variáveis aqui podem ser declaradas dentro do while double media = 0, soma = 0; int j = 0; notas_aluno[j] = 0; for (int i = 0; i < nome_aluno.length; i++) { System.out.println("Insira o nome do aluno: "); nome_aluno[i] = sc.nextLine(); // usa sc.nextLine() //soma = 0; for (j = 0; j < notas_aluno.length; j++) // porque 4 ? usa o notas_aluno.length { System.out.println("Entre com a " + (j + 1) + " ª nota do aluno: " + (i + 1)); notas_aluno[j] = sc.nextDouble(); //notas_aluno[j] = Double.parseDouble(sc.nextLine()); // usa Double.parseDouble(sc.nextLine()) soma = soma + notas_aluno[j]; } media = soma / 5; // pq 5 ? usa o notas_aluno.length String aproveitamento = ""; if (media >= 9 && media <= 10) { aproveitamento = "A"; } else if (media >= 7.5 && media < 9) { // não precisa testar se é < 9 aproveitamento = "B"; } else if (media >= 6 && media < 7.5) { // não precisa testar se é < 7.5 aproveitamento = "C"; } else if (media >= 4 && media < 6) { // não precisa testar se é < 6 aproveitamento = "D"; } else if (media >= 0 && media < 4) { // não precisa testar se é < 4 aproveitamento = "E"; } System.out.println("Média: " + media); System.out.println("Conceito: " + aproveitamento); switch (aproveitamento) { case "A": case "B": case "C": System.out.println("APROVADO"); break; case "D": case "E": System.out.println("REPROVADO"); break; } System.out.print("Deseja Continuar? <s/n>: "); resp = sc.nextLine(); // usa sc.nextLine() if (resp.equalsIgnoreCase("n")) opcao = true; } }while (!opcao); String resp; boolean opcao = false; Scanner sc = new Scanner(System.in); do { System.out.print("Deseja Continuar? <s/n>: "); resp = sc.nextLine(); //} while (!opcao.equalsIgnoreCase(resp)); //while ( opcao != 'n'); // só pára se for == 'n' if(resp.equalsIgnoreCase("n")) { opcao = true; System.out.println("Saiu!"); //break; } }while(!opcao); ...> Prazer a todos. Interessante, seu eu tirar o código entre o d{ e a pergunta para sair, o while funciona perfeitamente, porém se eu retorno como o código para ler as notas e calcular o while não funciona para quando tiver menos de 50 alunos. Não consigo encontrar o erro. Obrigado.
    • Por Pavolin9
      Bom dia, estou desenvolvendo um sistema bem simples de estoque onde os itens serao armazenados em uma matriz segue codigo:
          package main;          import java.io.Console;     import java.util.Arrays;     import java.util.Scanner;          public class IncluirItem{         public static void main(String[] args) {             String[][] itens = new String[2][5];             String[] campos = new String[7];             int opcao = 0;             int remover;             int verificar = 0;             int adcionar = 0;             int tamanho = 2;                          Scanner sc = new Scanner(System.in);                          campos [1] = "Nome";             campos [2] = "Codigo de barras";             campos [3] = "quantidade";             campos [4] = "validade";             campos [5] = "data de entrada";                          do {                 System.out.println("\n\n### Sistema de estoque - simplificado ###");                 System.out.println("=========================================");                 System.out.println("      |     1 - Adcionar itens   |");                 System.out.println("      |     2 - Excluir itens    |");                 System.out.println("      |     3 - Mostrar itens    |");                 System.out.println("      |     0 - Sair             |");                 System.out.println("=========================================\n");                                  System.out.println("Escolha uma opcao: ");                 opcao = sc.nextInt();                 System.out.print("\n");                                  switch (opcao) {                 case 1:                     System.out.println("Cadastro de itens: ");                     //Adciona itens                      for (int i = 0; i <2; i++) {                         System.out.println("Adcionar item? ");                         System.out.println("1 para sim \n2 para nao: ");                         adcionar = sc.nextInt();                         if (adcionar == 1) {                             System.out.printf("%d. item \n", (i+1));                             verificar = verificar + 1;                             for (int j=0; j < 5; j++) {                                     System.out.printf("%s ", campos[j+1]);                                 System.out.printf("= ", i,(j+1));                                 itens[i][j] = sc.next();                                                              }                             System.out.printf("\n");                         }                         else {                             break;                         }                     }                                              break;                 case 2:                     //Remove itens                     System.out.println("Exclusao de itens: ");                     if(verificar > 0) {                         for (int i = 0; i <2; i++) {                                 System.out.printf("%d. item \n", (i+1));                             System.out.printf("ID do produto= 00%d \n", (i+1));                             System.out.printf("\n");                         }                     }                     else {                         System.out.println("Nenhum item listado!");                     }                     System.out.println("\nEscolha o numero do item a ser removido: \n");                     remover = sc.nextInt();                     for (int i = 0; i <2; i++) {                         if(remover == 2) {                         itens[i] = itens[i-1];                         }                     }                     break;                 case 3:                     //Mostra itens                     if(verificar > 0) {                                                      for (int i = 0; i <2; i++) {                                     if (verificar == 2) {                                 System.out.printf("%d. item \n", (i+1));                                 System.out.printf("ID do produto= 00%d \n", (i+1));                                 for (int j=0; j < 5; j++) {                                         System.out.printf("%s ", campos[j+1]);                                     System.out.printf("= %s \n", itens [i][j]);                                 }                                 System.out.printf("\n");                             }                             else {                                         itens = Arrays.copyOf(itens, tamanho - 1);                                         verificar = 0;                                         System.out.printf("%d. item \n", (i+1));                                         System.out.printf("ID do produto= 00%d \n", (i+1));                                         for (int j=0; j < 5; j++) {                                                 System.out.printf("%s ", campos[j+1]);                                             System.out.printf("= %s \n", itens [i][j]);                                         }                                         System.out.printf("\n");                                         break;                                 }                         }                     }                     else {                         System.out.println("Nenhum item listado!");                     }                                          break;                 default:                     System.out.println("Opção Inválida!");                     break;                 }             } while(opcao != 0);         }     }  
      Minha duvida é a seguinte, eu quero excluir uma posicao da matriz, exemplo: registrei dois itens, na coluna um e coluna dois da matriz e gostaria de remover a coluna um da lista, como realizo essa função, e outra coisa, eu gostaria de quando eu inserisse pela segunda vez algum item a matriz começasse na proxima possicao vazia, atualmente se eu pedir para inserir um novo item a matriz começa da primeira posicao e assim apaga os elementos ja inseridos.
       
×

Informação importante

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