Jump to content

Qual é o erro nesse código?


bornman

Recommended Posts

Olá, o exercício que estou resolvendo pede as seguintes coisas:
1) Peça para o usuário digitar dois números inteiros positivos que correspondem ao tamanho de dois vetores A e B respectivamente;
2)Aloque a memória para esses dois vetores e peça para que o usuário digite valores inteiros positivos para preencher o vetor A e após isso, valores para preencher o vetor B;
 

Segue o código que eu fiz: 

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

int main()
{
    int a, b, vet1[a], vet2[b], *alocar, *alocarb, i=0, j=0;
    printf("Digite o primeiro numero que corresponde ao tamanho do vetor A: \n");
    scanf("%d", &a);
    printf("Digite o primeiro numero que corresponde ao tamanho do vetor B: \n");
    scanf("%d", &b);
    alocar = (int*)malloc(sizeof(a));
    alocarb = (int*)malloc(sizeof(b));
    for(i=0; i<a; i++)
        {
            printf("Digite o valor %d do vetor A: ", i);
            scanf("%d", &vet1[i]);
        }
    for(j=0; j<b; j++)
        {
            printf("Digite o valor %d do vetor B: ", j);
            scanf("%d", &vet2[j]);
        }
}



O programa nem está executando(para de funcionar), creio que tenha algo a ver com a memória.

Link to comment
Share on other sites

  • Moderators

Boa noite!

Vou postar um código rodando aqui e apontar algumas coisas, pode ser?

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

int main()
{
    int a, b, *alocar, *alocarb, i;
    printf("Digite o primeiro numero que corresponde ao tamanho do vetor A: ");
    scanf("%d", &a);
    printf("Digite o primeiro numero que corresponde ao tamanho do vetor B: ");
    scanf("%d", &b);

    alocar = malloc(sizeof(int)*a);
    alocarb = malloc(sizeof(int)*b);
    for(i=0; i<a; i++)
        {
            printf("Digite o valor do vetor A: ");
            scanf("%d", (alocar+i));
        }
    for(i=0; i<b; i++)
        {
            printf("Digite o valor do vetor B: ");
            scanf("%d", (alocarb+i));
        }

    free(alocar);
    free(alocarb);
}

Então...

  •  No seu código você declarou tanto ponteiros quanto vetores, sendo que no ex só pedia pra você usar ponteiros de forma dinâmica (o que é um problema pois você alocou memória e não a utilizou, praticamente deixou dois ponteiros apontando pra nada)
  • Você criou 2 vetores com tamanho a e b sendo que estas variáveis não tinham valor nenhum, ou seja, os vetores não tinham sido inicializados e não estavam com tamanho definido (o que é um problema).
  • A função printf já pula a linha por si só, não precisa do \n no fim.
  •  Quando você for dar malloc não precisa do casting como em (int *)malloc, pois seu retorno é um ponteiro do tipo (void *), mas tudo bem usar casting... A questão aqui é que foi usado malloc(sizeof(a)) sendo que a é uma variável do tipo INT, ou seja, seu tamanho é de 4 bytes. Para ver o tamanho determinado anteriormente do vetor devemos usar malloc(sizeof(int)*a). Por que? Porque estamos alocando a endereços de inteiros que serão retornados para alocar.
  • Nos looping não precisa criar duas variáveis, se você zera uma só em loopings diferentes a cada novo for o valor será 0 novamente, independente do valor que tinha no for anterior
  • O jeito que você fez no for está ok: &vet, a única coisa é que como estes vetores são desnecessários bastaria você trocar por alocar e alocarb
  • O jeito que trabalhei com os ponteiros no scanf indica que estou olhando para o endereço que ponteiro aponta e andando conforme i incrementa (ou seja, de 4 em 4 bytes, tendo em vista que meu ponteiro é de int e int vale 4 bytes no seu pc)
  •  Sempre que alocar memória dinâmicamente com malloc use um free no ponteiro após terminar de usar. Isto "desaloca" a memória utilizada e diz ao sistema operacional que aquele espaço de memória pode ser usado futuramente.    

 

Da uma lida sobre tudo isso que falei mano, acho que vai ti ajudar bastante. Indico o curso de C feito pelo Papo Binário, ele mostra tudo isso que falei e mais ainda. Não fique chateado, C é do demônio (mas é lindo) kkkkkk

 

Abraço!!

Link to comment
Share on other sites

10 horas atrás, Leandro Fróes disse:

Boa noite!

Vou postar um código rodando aqui e apontar algumas coisas, pode ser?


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

int main()
{
    int a, b, *alocar, *alocarb, i;
    printf("Digite o primeiro numero que corresponde ao tamanho do vetor A: ");
    scanf("%d", &a);
    printf("Digite o primeiro numero que corresponde ao tamanho do vetor B: ");
    scanf("%d", &b);

    alocar = malloc(sizeof(int)*a);
    alocarb = malloc(sizeof(int)*b);
    for(i=0; i<a; i++)
        {
            printf("Digite o valor do vetor A: ");
            scanf("%d", (alocar+i));
        }
    for(i=0; i<b; i++)
        {
            printf("Digite o valor do vetor B: ");
            scanf("%d", (alocarb+i));
        }

    free(alocar);
    free(alocarb);
}

Então...

  •  No seu código você declarou tanto ponteiros quanto vetores, sendo que no ex só pedia pra você usar ponteiros de forma dinâmica (o que é um problema pois você alocou memória e não a utilizou, praticamente deixou dois ponteiros apontando pra nada)
  • Você criou 2 vetores com tamanho a e b sendo que estas variáveis não tinham valor nenhum, ou seja, os vetores não tinham sido inicializados e não estavam com tamanho definido (o que é um problema).
  • A função printf já pula a linha por si só, não precisa do \n no fim.
  •  Quando você for dar malloc não precisa do casting como em (int *)malloc, pois seu retorno é um ponteiro do tipo (void *), mas tudo bem usar casting... A questão aqui é que foi usado malloc(sizeof(a)) sendo que a é uma variável do tipo INT, ou seja, seu tamanho é de 4 bytes. Para ver o tamanho determinado anteriormente do vetor devemos usar malloc(sizeof(int)*a). Por que? Porque estamos alocando a endereços de inteiros que serão retornados para alocar.
  • Nos looping não precisa criar duas variáveis, se você zera uma só em loopings diferentes a cada novo for o valor será 0 novamente, independente do valor que tinha no for anterior
  • O jeito que você fez no for está ok: &vet, a única coisa é que como estes vetores são desnecessários bastaria você trocar por alocar e alocarb
  • O jeito que trabalhei com os ponteiros no scanf indica que estou olhando para o endereço que ponteiro aponta e andando conforme i incrementa (ou seja, de 4 em 4 bytes, tendo em vista que meu ponteiro é de int e int vale 4 bytes no seu pc)
  •  Sempre que alocar memória dinâmicamente com malloc use um free no ponteiro após terminar de usar. Isto "desaloca" a memória utilizada e diz ao sistema operacional que aquele espaço de memória pode ser usado futuramente.    

 

Da uma lida sobre tudo isso que falei mano, acho que vai ti ajudar bastante. Indico o curso de C feito pelo Papo Binário, ele mostra tudo isso que falei e mais ainda. Não fique chateado, C é do demônio (mas é lindo) kkkkkk

 

Abraço!!

Obrigado Leandro, já assisti o curso do Papo Binário e aprendi bastante mas as vezes ainda esqueço algumas coisas.
Tenho algumas dúvidas, quando for declarar um vetor então pode ser apenas a em vez de a[]? E como faço para imprimir o vetor, por exemplo: a[0] = ..., a[1] = ...., a[2] = ....?

Link to comment
Share on other sites

  • Moderators

Bom dia!

 

Não. Se você fizesse, por exemplo, int a você estaria apenas declarando uma variável do tipo inteiro chamada a. Um vetor pode ser declarado de várias formas, vou mostrar aqui as três mais comuns:

#include <stdio.h>

int main(){

  int v[5];
  int a[] = {1,2,3,4,5};
  int i;

  for(i=0;i<5;i++){
    printf("Digite um numero para o vetor: ");
    scanf("%d", &v[i]);
  }

  for(i=0;i<5;i++){
    printf("Seu vetor v possui na posicao %d: %d\n", i, v[i]);
    printf("Seu vetor a possui na posicao %d: %d\n", i, a[i]);
  }

  return 0;
}

Aqui declarei 2 vetores, o primeiro possui um tamanho, mas não foi inicializado e o segundo não possui um tamanho, mas o compilador verifica através dos elementos que foram inseridos nele. Quanto a imprimir o vetor podemos fazer igual você fez, com um for :). O que é importante notar aqui é que um vetor não inicializado pode conter lixo, tendo em vista que não sabemos o que tem naqueles 5 espaços que declaramos para o nosso vetor. Segue um exemplo sem inicializar o vetor v:

Seu vetor v possui na posicao 0: -1354054000
Seu vetor v possui na posicao 1: 21979
Seu vetor v possui na posicao 2: -1354054336
Seu vetor v possui na posicao 3: 21979
Seu vetor v possui na posicao 4: -1204222352

Viu o quanto de lixo de memória tinha nele antes de o preenchermos? Legal né? kkkkkk Podemos também dizer o tamanho e inicializar!!

 

A outra forma (e foi a que seu exercício pedia) era alocando memória dinâmicamente, ou seja, em tempo de execução conforme a necessidade e para isso declaramos um ponteiro e ele recebe malloc, que por sua vez devolve um ponteiro do tipo void * para o nossa variável do tipo ponteiro:

 

"The  malloc()  and calloc() functions return a pointer to the allocated memory, which is suitably aligned for any  built-in  type"

 

Com isso podemos alocar espaços de memória de acordo com algum acontecimento ou com o input do usuário. Tudo que estou falando aqui é por cima, tenta entender por baixo dos panos que você vai longe :ph34r:. Acho que é isso, qualquer coisa manda ai pra gente!

 

Abraço!

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...