Tenho um erro de compilação de "tipo de ponteiro incompatível" com o código a seguir.
f(unsigned char** arr)
{
unsigned char* p = *arr;
}
int main()
{
unsigned char a[31];
f(&a);
}
Gostaria de entender por que e como consertar.
Editar
Desculpe, omiti um ponto.
Quando compilo com o gcc, é apenas um aviso, mas o g++ gera isso como erro.
cannot convert ‘unsigned char (*)[31]’ to ‘unsigned char**’`
Quero corrigir o erro ao usar g++.
A expressão
&a
possui o tipo "ponteiro para array deunsigned char
tamanho 31", ou seja,unsigned char (*)[31]
difere do parâmetro declarado deunsigned char **
, e o primeiro não pode ser convertido no segundo.Presumivelmente, você deseja operar no array de dentro da função. Sendo assim, basta alterar o tipo do parâmetro para
unsigned char *
e passara
diretamente para a função:Isso é permitido porque uma matriz, quando usada em uma expressão (exceto como operando de
&
), decai em um ponteiro para seu primeiro elemento. Especificamente, a matriz do tipounsigned char[31]
decai para um ponteiro do tipounsigned char *
quando passada para uma função.a
é uma matriz de 31unsigned char
(unsigned char[31]
).&a
é um ponteiro para tal array (unsigned char (*)[31]
).Você está tentando "atribuir" isso a
arr
, que é um ponteiro para um ponteiro para umunsigned char
.&a
não aponta para um ponteiro.&a
não é compatível comunsigned char **
.Abordagem usual: (ponteiro para o primeiro elemento)
Abordagem alternativa: (ponteiro para a matriz)