paulo1205
(usa Ubuntu)
Enviado em 23/08/2012 - 22:44h
FennFelis escreveu:
opa, declarei um ponteiro dinamico assim.
int *p;
p=(int*)malloc(10*sizeof(int));
//Eu sei que o ponteiro *p == p[10]
//quando eu uso bzero(), eu devo colocar 10*sizeof(int) no segundo parametro para zerar todas posições de p?
//OBS: bzero(), zera o primeiro argumento
Não sei se você foi muito feliz com a afirmação "*p == p[10]". Numa expressão, *p (que significa "conteúdo da posição de memória indicada por 'p'") é equivalente, isso sim, a p[0] (que significa "a partir da posição de memória indicada por 'p', desloque-se '0' elementos e use o conteúdo da posição de memória resultante").
Aliás, se você alocou um bloco de dez posições, elas residem em p[0] a p[9]. Usar p[10] é um erro.
Dito isso, você passar para bzero() o tamanho total em bytes da área alocada, e tal tamanho é exatamente o mesmo que você passa a malloc().
No entanto, acho pertinente você saber duas coisas: (1) bzero() não faz parte da bblioteca padrão, de modo que não é encontrado em todos os sistemas, e mesmo no mundo UNIX tal função é considerada obsoleta: em lugar de "bzero(p, tamanho)", deve-se preferir "memset(p, 0, tamanho)"; e (2) se você quiser alocar memória e logo em seguida zerar a região alocada, pode se interessante usar calloc() (como exemplo de uso, veja que os dois códigos abaixo são equivalentes, mas o primeiro é mais sucinto e quiçá mais elegante).
int *p;
p=calloc(num_elementos, sizeof (*p));
int *p;
p=malloc(num_elementos*sizeof (*p));
if(p!=NULL){
memset(p, 0, num_elementos*sizeof (*p));
}