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.

Foi útil?

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ó chars, 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 intS.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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top