Pergunta

Dado este código C compilado com gcc 4.3.3

#include <stdio.h>
#include <stdlib.h>


int main(int argc, char * argv[])
{

    int * i;

    i = (int *) malloc(sizeof(int));

    printf("%d\n", *i);
    return 0;

}

Eu esperaria que a saída seja o que fosse na memória que malloc () retorna, mas a saída é 0. malloc zerar a memória ele retorna? Se sim, porquê?

Foi útil?

Solução

malloc si não de zero a memória, mas isso muitas sistemas operacionais irá zerar a memória que os seus pedidos de programas por razões de segurança (para manter um processo de acessar informações potencialmente confidenciais que foi usado por outro processo).

Outras dicas

A função malloc() não define a memória alocada para qualquer valor específico. Se você quer ter a certeza da memória é zero, o uso calloc() ou equivalente. Caso contrário, você conseguir tudo o que havia antes (o que pode, no seu caso, ser zero).

O valor na memória alocada é indefinido oficialmente. C99 afirma: The malloc function allocates space for an object whose size is specified by size and whose value is indeterminate. malloc () pode fazer o que quiser, incluindo zerar-lo. Isso pode ser deliberada, um efeito colateral da implementação, ou você pode apenas ter um monte de memória que passa a ser 0.

FWIW no OS X com gcc da Apple 4.0.1 eu não posso fazê-lo sair não 0, mesmo fazendo um monte de atribuições:

for( idx = 0; idx < 100000; idx++ ) {
    i = (int *) malloc(sizeof(int));
    printf("%d\n", *i);
}

Malloc não tem a memória de preenchimento. Por motivos de desempenho, as versões de lançamento, muitas vezes não fazer nada com a memória. Uma biblioteca "seguro" pode ter uma implementação de malloc que limpa a memória. Cabe ao implementador biblioteca. Existem alguns padrões comuns que são preenchidos na memória por bibliotecas de depuração vários do compilador que são explicadas neste tópico stackoverflow .

Você definitivamente não pode depender de ele ser 0. malloc um pedaço maior e despejá-lo para ver.

Se a sua int; int = 0; ou int = 00000000; sua vai ocupar o mesmo espaço na memória. o printf, muitas vezes, pegar o primeiro 0 como um terminador nulo, independentemente do que o resto é na cadeia. Se você estiver usando comparadores cordas e 0 é um espaço reservado eu recomendo que você usar qualquer coisa, mas 0 para que o titular lugar como bibliotecas cordas baseada realmente chupar. Tente F e, em seguida, escrever o controle em si mesmo inserindo termo nulo ou nova linha como necessidade seja ele estará muito mais portátil.

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