Analisei muitas perguntas semelhantes sobre esse assunto, mas a maioria parece se concentrar em um ponteiro sendo passado para uma função como parâmetro em vez do endereço do ponteiro, então não encontrei minha resposta.
Um segfault ocorre na linha 11. Por quê?
Saúde.
void allocateMem(int **ptr)
{
int i = 0 ;
*ptr = malloc(100 * sizeof(int)) ;
if(*ptr != NULL)
{
for(i = 0 ; i < 100 ; i ++)
{
*ptr[i] = i ; //segfault
printf("%d %d\n" , i , *ptr[i]) ;
}
free(*ptr) ;
}
else
exit(0) ;
}
int main(int argc , char *argv[])
{
int *ptr = NULL ;
allocateMem(&ptr) ;
return 0 ;
}
Esta é uma questão de precedência.
*ptr[i]
é equivalente a*(ptr[i])
quando você quis dizer(*ptr)[i]
. Naturalmente,*(ptr[i])
pode causar um segfault porque o conteúdo do array alocado dinamicamente é indeterminado e então você está desreferenciando esse valor indeterminado.Outras sugestões para seu código:
i
.*ptr
. Dessa forma, no caso de uma falha de alocação de memória, a memória original apontada por*ptr
ainda é endereçável.