TransWikia.com

Comportamento do malloc(1) em C

Stack Overflow em Português Asked on November 30, 2021

Se eu usar char *char_commandout = (char *) malloc(1);, o byte alocado irá armazenar o “” na posição 0 do vetor ou irá alocar um espaço para o valor que eu quero armazenar (na posição 0) e um para o “” (na posição 1)?

2 Answers

O Victor já deu a resposta base da dúvida, vou acrescentar que é comum as pessoas usarem um memset() para zerar a memória quando necessário. Quando é necessário o calloc() pode ser usado para alocar e já zerar. Em tese é possível ter otimizações, talvez até em conjunto com o sistema operacional para ganhar performance, mas não conte com isto, inclusive porque sequer o c/re/malloc() precisar ser o original. A diferença pro malloc() é a limpeza dos dados.

No caso de interpretar o dado como uma string, e em C você pode interpretar como quiser, um 1 byte zerado será uma string com 0 caracteres, o será o terminador da string.

Em C não é adequado fazer cast do resultado do malloc(), isto pode esconder erros, então o que deseja é só:

char *char_commandout = calloc(1);

Porém de forma geral isto não faz sentido porque você já sabe o conteúdo e ele não pode mudar de forma útil e correta, mesmo que precise de uma string de tamanho 0 o ideal é fazer isso estaticamente, até mesmo usado o Flyweight.

Outra curiosidade que não faz o menor sentido é usar

malloc(sizeof(char))

Coloquei no GitHub para referência futura.

É garantido por especificação que char tem sempre o tamanho 1, no fundo ele é 1 byte. Há quem argumente que um dia pode mudar, o que é risível, principalmente porque sempre é dito por um programador "experiente".

Geralmente alocações no heap acima de 8 bytes, até mesmo 16 fazem bem pouco sentido e nos casos que faz seria o caso de repensar se pode fazer de outra forma. Em coisas pequenas acima o consumo de memória pra controlar a alocação é maior que o dado em si. Claro que não é a única forma de decidir, tem coisas que precisam de uma alocação por tempo indeterminado, mas também quase sempre dá para evitar isto. Na prática a alocação será muito maior que 1 byte, mas você só poderá acessar 1 byte, e ai de você se tentar acessar mais que um antes ou depois dele, até funcionará, mas para seu bem tomara que o código quebre em seguida.

Answered by Maniero on November 30, 2021

Nenhum dos dois. O malloc aloca a área de memória, mas não a limpa. Assim sendo, qualquer conteúdo que estivesse abandonado lá vai continuar lá (esse conteúdo é carinhosamente denomidado de lixo). Por isso, o conteúdo do ponteiro após o malloc pode ser qualquer coisa, pois contém lixo.

É recomendado escrever algo na memória alocada para evitar que você acesse conteúdo que seja lixo, o que provavelmente faria o programa se comportar de forma incorreta.

Se você chamar malloc(1), será devolvido um ponteiro que aponta para 1 byte de memória alocada. Pode até ser que o malloc internamente reserve uma área maior por questão de desempenho, mas a única garantia que existe é que 1 byte de memória reservada lhe será devolvido (reservada, mas não limpa), e que se você acessar além do limite (o segundo byte, na posição 1), estará acessando uma área de memória não reservada (o que pode causar uma falha de segmentação, acessar o conteúdo de alguma outra variável ou então ler ou escrever lixo em algum lugar).

Answered by Victor Stafusa on November 30, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP