por que usamos sizeof usando malloc?[fechado]
-
23-12-2019 - |
Pergunta
Qual é o propósito de usar sizeof
usando malloc
em C
?Por que é necessário?
Quero dizer, podemos usar sizeof
mas já sabemos o tamanho(=1000 bytes) que estamos alocando na memória?
Sou iniciante em C então.Esta pode ser uma pergunta muito óbvia.
Solução
Tipos de dados e matéria de memória
A resposta está nos tipos de dados.Enquanto você sabe quantos objetos você deseja alocar memória, talvez não queira se dar ao trabalho de calcular mentalmente seu tamanho.
O mesmo acontece com a sustentabilidade
Além disso, e se a composição deles mudar posteriormente?Aí você está ferrado e tem que editar tudo.
Então isso é irrelevante no seu exemplo, sem contexto.Mas no caso em que você deseja alocar memória para coisas mais complexas (digamos, uma estrutura com vários campos), isso se torna bastante importante e útil.
Exemplo 1 (não tão importante aqui):
char *s = malloc(100 * sizeof(char));
Mas ei, é só char
s, tudo bem, você poderia ter feito isso:
char *s = malloc(100);
Geralmente funciona.Mas dar um tiro no próprio pé, como você verá a seguir.
Exemplo 2 (já importa um pouco):
int *i = malloc(100 * sizeof(int));
Claro, você poderia ter escrito isso:
int *i = malloc(100 * 4);
Isto é, supondo que você desenvolva apenas uma arquitetura que você conhece muito bem.
Exemplo 3 (começando a importar bastante!):
typedef struct s_listelement{
int dataitem;
struct s_listelement *link;
} t_listelement;
t_listement *le = malloc(sizeof(t_listelement));
Agora imagine que a estrutura do item da lista vinculada contém vários outros campos...
Você gostaria de confiar sizeof()
, ou vá se divertir e fazer as contas sozinho?
Outras dicas
Suponha que você queira alocar memória para armazenar int
S.Seu palpite inicial será: ok, preciso ter n
inteiros e cada inteiro requer x
bytes.Então o espaço será n*x
bytes.
Mas na verdade isso x
depende da arquitetura.Talvez 16 bits, 32 bits, etc.Portanto, para que seu código funcione em diferentes ambientes, é recomendável usar n*sizeof(int)
em vez de n*x
.
Por exemplo, se você precisar alocar espaço para 10 inteiros:
int *p=malloc(sizeof(int)*10);
O que acontece se você alterar o tamanho de mallocated
?
Você terá que 1) calcular novamente o novo tamanho (deixando de lado os problemas de múltiplas arquiteturas de alvo, onde você terá que calcular o novo tamanho em cada alvo), 2) procurar por todos malloc(1000)
, certifique-se de que se refere a mallocated
(o que pode não ser óbvio) e substitua por um novo tamanho.
Você não tem nenhum desses 2 problemas ao usar sizeof
.Assim usando sizeof
leva a um código mais sustentável e legível.