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);
}
Foi útil?

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.

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