na parte: void *malloc(size_t numero_de_bytes); porque tem o esterisco em "malloc"? é um ponteiro?
30 de dezembro de 2013 às 14:39
Anônimo disse...
parabéns,,,bem explicado,pois não só joga o assunto para vc estudar..tem também o motivo e o porque de usar tal função...obs: eu sou o dois anônimos de cima)
Respondendo a pergunta do amigo. o austerístico se deve ao fato de a função malloc() retorna um ponteiro, isto é, o endereço de memória do primeiro elemento alocado. Nos protótipos de funções, quando aparecer o "*" ante de qualquer elemento, significa que ele é um ponteiro ou retorna um endereço.
Olá, só uma dúvida, na parte que fala sobre o caso de alocarmos uma string com 20 caracteres tem o trecho de código.
printf("%sn", nome);
essse SN existe? ou só seria printf("%s", nome); ???
19 de dezembro de 2015 às 05:09
Anônimo disse...
Não faz sentido! veja bem, entendi que a principal ideia do uso malloc ou calloc, seria a de liberar uma memoria "expansiva" correto?, como no caso do cadastro de um nome completo, como não temos como saber a quantidade de caracteres, nós criamos o malloc, dessa forma, o campo ira se ajustar ao tamanho exato digitado pelo usuário, correto?
Mas em todo vídeo que vejo, o professor insere a quantidade de bytes, mas pq isso? se vc insere a quantidade de bytes, vc esta prevendo a quantidade de caracteres, fugindo de toda lógica do malloc.
Todo vídeo, se usa a seguinte sintaxe: char *nome_do_cliente = (char *) malloc(10*sizeof(char));
Mas veja bem, se eu coloco 10* ali, eu estou presumindo o tamanho! não faz sentido! o correto não deveria ser: char *nome_do_cliente = (char *) malloc(sizeof(nome_do_cliente));
de forma que ele pegue o tamanho alocado no nome_do_cliente, ao passo que o campo é preenchido?
Não estou conseguindo entender isso, eu entendi a sintaxe, e tudo, menos a finalidade, pois como dito, todo exemplo que vejo, presumi o tamanho do campo! Alguém pode me ajudar?
Kissaba.. testei aki o printf("%sn", nome); e so com o S pegou, acho q é S de string o n é so uma letra normal, até por que quando imprimimos na tela exemplo o nome Ruan fica com o n no final tipo: Ruann
olha, eu acho que esse %sn era pra ser printf("%s\n",nome);
4 de setembro de 2016 às 13:05
Anônimo disse...
eu acho que o numero ali que ja sao inseridos ...diz respeito ao maximo de caracterres que pode ser alocado ... mas caso o usuario digite um valor menor de caracteres o sizeoff ira diminuir o tamanho da memoria...acho que e isso ...
Também seria bom não usar funções descontinuadas da linguagem num material didático introdutório como a função gets(), que foi retirada do padrão da linguagem por ser uma função não segura.
Use outras funções como fgets() ou scanf() para que o aluno pegue boas práticas de programação.
29 de maio de 2018 às 21:24
Anônimo disse...
"Não estou conseguindo entender isso, eu entendi a sintaxe, e tudo, menos a finalidade, pois como dito, todo exemplo que vejo, presumi o tamanho do campo! Alguém pode me ajudar?" Não está fugindo a lógica do malloc, esta é a logica do malloc. Malloc nesse caso cria um vetor. Ex.: quando usamos int p[3], estamos fazendo um int* p = (p*) malloc(3*sizeof(int)); sobre esse tipo de alocação que deseja pesquisa ""Alocação Dinãmica""..
14 de março de 2019 às 17:24
Outra boa prática é evitar o uso de números para escolher o número de bytes alocados.
Isso se deve ao fato de diferentes variáveis terem diferentes valores, dependendo da arquitetura.
Há máquina que um inteiro ocupa 2 bytes, em outras ocupam 4 bytes.
Sim, é um processo trabalhoso e enfadonho. E isso não é o pior.
Como veremos no próximo tutorial de C de nossa apostila, vamos ver os principais problemas decorrentes de uma má alocação de memória.
É um assunto um pouco delicado, mas não devemos fugir do uso dinâmico de memória, pois essa é uma das técnicas mais úteis para se otimizar programas, deixá-los mais rápidos e fazer menos uso de memória.
Para alocar de maneira correta, sem medo de errar (e de ser feliz), use a função sizeof():
char *nome = (char *) malloc(21*sizeof(char));
Sim, é um processo trabalhoso e enfadonho. E isso não é o pior.
Como veremos no próximo tutorial de C de nossa apostila, vamos ver os principais problemas decorrentes de uma má alocação de memória.
Por hora, estamos mostrando apenas exemplos simples.
Obviamente que os computadores atuais tem muitos mais memória que 20 bytes para um nome, e em aplicativos simples como este, a alocação não é necessária.
Mas para trabalhar com microprocessadores e microcontroladores, por exemplo, onde o tamanho da memória é algo crítico, é necessário ter controle de cada byte.
Mas ainda nesse curso você verá uma utilização bem prática e essencial da alocação dinâmica de memória (e consequentemente, mais uma aplicação de ponteiros), que será no estudo de estruturas dinâmicas de dados, para fazer Listas encadeadas, Filas e Pilhas.
Por hora, vamos treinar os conceitos básicos.
Exercício: Calculando a média de qualquer quantidade de números com malloc()Crie um programa que calcula a média de uma quantidade qualquer (informada pelo usuário) de números. O programa deve armazenas esses números em um vetor. Depois, use esse vetor para mostrar todos os números e mostrar a média dele. Use alocação dinâmica de memória para colocar os números no vetor. Não desperdice memória.
Resolveremos essa questão no próximo tutorial de nossa apostila de C, quando ensinarmos a desalocar (liberar) a memória alocada, com a função free().
postado por Programação Progressiva às 14:47 em 21 de abr. de 2013
11 Comentários
Fechar esta janela Ir para formulário de comentáriona parte: void *malloc(size_t numero_de_bytes); porque tem o esterisco em "malloc"? é um ponteiro?
30 de dezembro de 2013 às 14:39
parabéns,,,bem explicado,pois não só joga o assunto para vc estudar..tem também o motivo e o porque de usar tal função...obs: eu sou o dois anônimos de cima)
30 de dezembro de 2013 às 14:46
Respondendo a pergunta do amigo. o austerístico se deve ao fato de a função malloc() retorna um ponteiro, isto é, o endereço de memória do primeiro elemento alocado. Nos protótipos de funções, quando aparecer o "*" ante de qualquer elemento, significa que ele é um ponteiro ou retorna um endereço.
19 de fevereiro de 2014 às 09:05
Olá, só uma dúvida, na parte que fala sobre o caso de alocarmos uma string com 20 caracteres tem o trecho de código.
printf("%sn", nome);
essse SN existe? ou só seria printf("%s", nome); ???
19 de dezembro de 2015 às 05:09
Não faz sentido! veja bem, entendi que a principal ideia do uso malloc ou calloc, seria a de liberar uma memoria "expansiva" correto?, como no caso do cadastro de um nome completo, como não temos como saber a quantidade de caracteres, nós criamos o malloc, dessa forma, o campo ira se ajustar ao tamanho exato digitado pelo usuário, correto?
Mas em todo vídeo que vejo, o professor insere a quantidade de bytes, mas pq isso? se vc insere a quantidade de bytes, vc esta prevendo a quantidade de caracteres, fugindo de toda lógica do malloc.
Todo vídeo, se usa a seguinte sintaxe: char *nome_do_cliente = (char *) malloc(10*sizeof(char));
Mas veja bem, se eu coloco 10* ali, eu estou presumindo o tamanho! não faz sentido! o correto não deveria ser: char *nome_do_cliente = (char *) malloc(sizeof(nome_do_cliente));
de forma que ele pegue o tamanho alocado no nome_do_cliente, ao passo que o campo é preenchido?
Não estou conseguindo entender isso, eu entendi a sintaxe, e tudo, menos a finalidade, pois como dito, todo exemplo que vejo, presumi o tamanho do campo! Alguém pode me ajudar?
29 de agosto de 2016 às 07:41
Kissaba.. testei aki o printf("%sn", nome);
e so com o S pegou, acho q é S de string o n é so uma letra normal, até por que quando imprimimos na tela exemplo o nome Ruan fica com o n no final tipo: Ruann
portanto acho que é so o S mesmo, do %s..
1 de setembro de 2016 às 09:04
olha, eu acho que esse %sn era pra ser printf("%s\n",nome);
4 de setembro de 2016 às 13:05
eu acho que o numero ali que ja sao inseridos ...diz respeito ao maximo de caracterres que pode ser alocado ... mas caso o usuario digite um valor menor de caracteres o sizeoff ira diminuir o tamanho da memoria...acho que e isso ...
4 de fevereiro de 2017 às 15:46
o n na verdade era apenas para quebrar a linha.. o amigo esqueceu apenas de colocar \n
20 de maio de 2018 às 06:58
Não se usa casting como (char *) no retorno do malloc, isso não é necessário e causa erros:
O modo correto é:
char *nome;
nome = malloc(21 * sizeof *nome);
Fonte:
https://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc
Também seria bom não usar funções descontinuadas da linguagem num material didático introdutório como a função gets(), que foi retirada do padrão da linguagem por ser uma função não segura.
Use outras funções como fgets() ou scanf() para que o aluno pegue boas práticas de programação.
29 de maio de 2018 às 21:24
"Não estou conseguindo entender isso, eu entendi a sintaxe, e tudo, menos a finalidade, pois como dito, todo exemplo que vejo, presumi o tamanho do campo! Alguém pode me ajudar?" Não está fugindo a lógica do malloc, esta é a logica do malloc. Malloc nesse caso cria um vetor. Ex.: quando usamos int p[3], estamos fazendo um int* p = (p*) malloc(3*sizeof(int)); sobre esse tipo de alocação que deseja pesquisa ""Alocação Dinãmica""..
14 de março de 2019 às 17:24