bornman Posted February 16, 2018 at 07:56 PM Share Posted February 16, 2018 at 07:56 PM 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 More sharing options...
Leandro Fróes Posted February 17, 2018 at 02:42 AM Share Posted February 17, 2018 at 02:42 AM 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 More sharing options...
bornman Posted February 17, 2018 at 12:50 PM Author Share Posted February 17, 2018 at 12:50 PM 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 More sharing options...
Leandro Fróes Posted February 17, 2018 at 02:21 PM Share Posted February 17, 2018 at 02:21 PM 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 . Acho que é isso, qualquer coisa manda ai pra gente! Abraço! Link to comment Share on other sites More sharing options...
bornman Posted February 17, 2018 at 04:25 PM Author Share Posted February 17, 2018 at 04:25 PM Muito obrigado pela ajuda Leandro, vou dar mais uma estudada para esclarecer melhor. Até +. Link to comment Share on other sites More sharing options...
Fernando Mercês Posted February 20, 2018 at 08:57 PM Share Posted February 20, 2018 at 08:57 PM Que thread produtiva! Link to comment Share on other sites More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.