paulo1205
(usa Ubuntu)
Enviado em 02/09/2019 - 05:28h
Atr escreveu:
boa noite, estou lendo sobre alocação dinamica de memoria, porem me veio uma duvida!
tenho o seguinte codigo:
#include <stdio.h>
#include <stdlib.h>
int main(void){
char *n;
n = (char *) malloc(100 * sizeof(n));
A linha acima está errada.
A conversão explícita para
char * é redundante, porque a função
malloc() já retorna um valor do tipo
void *, que, em C, é automaticamente conversível e convertido para qualquer outro tipo de ponteiro. Ao colocar uma conversão explícita, você aumenta a quantidade de código em que tem de dar manutenção e não ganha absolutamente nada.
Mas o que está errado mesmo é o valor passado como argumento para a função. Ali, você pede para alocar espaço não para 100 caracteres, mas para 100 ponteiros para caracteres, pois o tipo de
n é
char *, não
char.
Eis a forma mais correta de fazer.
n=malloc(100*sizeof n[0]); // Vale para ponteiros de qualquer tipo (exceto “void *”).
printf("Nome: ");
scanf("%c", &n);
Mais dois (ou três, ou mesmo quatro) erros aqui.
O primeiro é que
n já é um ponteiro, então você não deve usar o operador
& para obter seu endereço. Se o fizer, a função
scanf() vai sobrescrever o valor do ponteiro atribuído a
n no momento da alocação, não o conteúdo da área alocada.
Outro erro é que a conversão
"%c" é para ler apenas um caráter, não uma sequência de caracteres.
Ainda mais um problema é que você não está testando o valor retornado pela função para saber se a operação de leitura foi bem sucedida ou não.
Por fim, se você vai ler uma string que tem um tamanho máximo, deveria limitar a quantidade de caracteres recebidos, a fim de se proteger contra corrupção de memória caso a quantidade de dados lidos seja maior do que o espaço destinado a recebê-los.
printf("seu nome é %c\n", n);
n = NULL;
Atribuir um valor nulo ao ponteiro não é suficiente para desalocar a memória que fora alocada. Você tem de usar a função
free() para isso.
return 0;
}
e caso eu queira usar vetor, eu teria que usar um loop, minha duvida é a seguinte...
tem como capturar uma palavra digitada pelo usuario sem usar loops?
Se você vai ler uma cadeia de caracteres, então vai haver
loops. Você pode até não enxergá-los, se substituir a leitura da cadeia explícita por uma chamada a uma função, mas dentro dessa função vai haver laços de repetição, com certeza.
pois eu teria que saber quantos caracteres o user digitou, e não vejo muita eficiencia nisso, pois teria que digitar letra por letra!
Você não precisa necessariamente fazer letra por letra, mas em blocos. Procure nos arquivos do fórum por “
my_fgets”.
... “Principium sapientiae timor Domini, et scientia sanctorum prudentia.” (Proverbia 9:10)