Jump to content
bornman

Qual é o erro nesse código?

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.

Edited by bornman

Share this post


Link to post
Share on other sites

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!!

Share this post


Link to post
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] = ....?

Edited by bornman

Share this post


Link to post
Share on other sites

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!

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...