Tamanhos diferentes de resultados
Pergunta
Porque n
não é igual a 8
na seguinte função?
void foo(char cvalue[8])
{
int n = sizeof (cvalue);
}
Mas n
faz igual a 8
nesta versão da função:
void bar()
{
char cvalue[8];
int n = sizeof (cvalue);
}
Solução
Porque você não pode passar arrays inteiros como parâmetros de função em C.Na verdade, você está passando um ponteiro para isso;os colchetes são açúcar sintático.Não há garantias de que o array para o qual você está apontando tenha tamanho 8, já que você pode passar para esta função qualquer ponteiro de caractere que desejar.
// These all do the same thing
void foo(char cvalue[8])
void foo(char cvalue[])
void foo(char *cvalue)
Outras dicas
Matrizes C e C++ não são objetos de primeira classe;você não pode passar arrays para funções, eles sempre decaem em ponteiros.
Você pode, entretanto, passar ponteiros e referências para arrays.Isso evita que os limites da matriz se deteriorem.Então isso é legal:
template<typename T, size_t N>
void foo(const T(&arr)[N])
{
int n = sizeof(arr);
}
No primeiro exemplo, cvalue como parâmetro passado é apenas um ponteiro para uma matriz de caracteres e quando você pega o sizeof()
disso, você obtém o tamanho do ponteiro.No segundo caso, onde você declarou como uma variável local, você obtém o tamanho de todo o array.
O tamanho do parâmetro em sistemas de 32 bits será 4 e em sistemas de 64 bits compilados com -m64 será 8.Isso ocorre porque os arrays são passados como ponteiros nas funções.O ponteiro é apenas um endereço de memória.