Por que o tamanho de um array enviado como parâmetro não é igual ao de main?
#include <stdio.h>
void PrintSize(int p_someArray[10]);
int main () {
int myArray[10];
printf("%d\n", sizeof(myArray)); /* As expected, 40 */
PrintSize(myArray);/* Prints 4, not 40 */
}
void PrintSize(int p_someArray[10]){
printf("%d\n", sizeof(p_someArray));
}
sizeof
operator retorna um objeto do tiposize_t
, então você deve imprimi-lo com%zu
(C99), ou convertê-loint
se você usar%d
como acima em suasprintf
chamadas.void PrintSize(int (*p_someArray)[10])
. O interior da função você pode acessar a matriz usando operador dereference*
:sizeof(*p_someArray)
. Isso terá o mesmo efeito que usar referências em C ++.É um ponteiro, por isso é uma implementação comum passar o tamanho do array como um segundo parâmetro para a função
fonte
Como outros afirmaram, os arrays decaem para ponteiros para seu primeiro elemento quando usados como parâmetros de função. Também vale a pena notar que sizeof não avalia a expressão e não requer parênteses quando usado com uma expressão, então seu parâmetro não está sendo usado, então você também pode escrever o sizeof com o tipo ao invés do valor.
fonte
Portanto, você precisará passar o comprimento do array como um segundo parâmetro. Quando você está escrevendo um código, no qual você declara uma matriz de tamanho constante e, posteriormente, passa essa matriz para uma função, é uma dor ter a constante de comprimento de matriz aparecendo em vários lugares em seu código ...
K&R para o resgate:
Agora você pode fazer, por exemplo:
fonte
Porque os arrays se transformam em ponteiros quando são passados como parâmetros. É assim que C funciona, embora você possa passar "matrizes" em C ++ por referência e superar esse problema. Observe que você pode passar matrizes de tamanhos diferentes para esta função:
fonte
O comportamento que você encontrou é, na verdade, uma grande verruga na linguagem C. Sempre que você declara uma função que recebe um parâmetro de matriz, o compilador o ignora e altera o parâmetro para um ponteiro. Portanto, todas essas declarações se comportam como a primeira:
a será um ponteiro para int em todos os quatro casos. Se você passar um array para func, ele imediatamente se tornará um ponteiro para seu primeiro elemento. (Em um sistema de 64 bits, um ponteiro de 64 bits é duas vezes maior que um int de 32 bits, portanto, seu tamanho de proporção retorna 2.)
O único propósito desta regra é manter a compatibilidade retroativa com compiladores históricos que não suportavam a passagem de valores agregados como argumentos de função.
Isso não significa que seja impossível passar um array para uma função. Você pode contornar essa verruga incorporando a matriz em uma estrutura (essa é basicamente a finalidade de std :: array do C ++ 11):
ou passando um ponteiro para a matriz:
Caso o tamanho do array não seja uma constante de tempo de compilação, você pode usar a técnica de ponteiro para array com arrays de comprimento variável C99:
fonte
Em c ++, você pode passar um array por referência para este propósito:
fonte
Na linguagem C, não há nenhum método para determinar o tamanho de um array desconhecido, então a quantidade precisa ser passada, bem como um ponteiro para o primeiro elemento.
fonte
char[]
arrays de string).Você não pode passar matrizes para funções.
Se você realmente deseja imprimir o tamanho, pode passar um ponteiro para um array, mas não será genérico, pois você também precisa definir o tamanho do array para a função.
fonte
O comportamento é por design.
Mesma sintaxe na declaração de parâmetro de função significa algo completamente diferente do que na definição de variável local.
O motivo é descrito em outras respostas.
fonte
Na linguagem C, quando você passa o array como um argumento para a função, ele é automaticamente convertido em ponteiro, o array passando de uma função para outra função é conhecido como chamada por referência. Esta é a razão pela qual a função chamada apenas recebe o ponteiro que aponta para o primeiro elemento da função Esta é a razão
fun (int a []) é semelhante a fun (int * a);
então, quando você imprimir o tamanho do array, ele imprimirá o tamanho do primeiro elemento.
fonte
Em 'C' linguagem de programação 'sizeof ()' é o operador e ele retorna o tamanho do objeto em bytes. O argumento do operador 'sizeof ()' deve ser um tipo de valor à esquerda (inteiro, número flutuante, estrutura, matriz ). Portanto, se você quiser saber o tamanho de um array em bytes, pode fazê-lo de maneira muito simples. Basta usar o operador 'sizeof ()' e como argumento o nome do array. Por exemplo:
A saída no sistema de 32 bits será: Tamanho de n é: 40.Porque ineteger no sistema de 32 é de 4 bytes. Em 64x é de 8 bytes. Neste caso, temos 10 inteiros declarados em uma matriz. Portanto, o resultado é '10 * sizeof ( int) '.
Algumas dicas:
Se tivermos uma matriz declarada como esta 'int n [] = {1, 2, 3, ... 155 ..};'. Portanto, queremos saber quantos elementos estão armazenados neste array. Use este alghoritmo:
sizeof (name_of_the_array) / sizeof (array_type)
Código: #include
a Principal(){
}
fonte
sizeof(n)
para uma variável local esizeof(arg)
para um argumento para uma função, embora ambos sejam aparentemente do tipoint[10]
.As matrizes têm tamanhos vagos. Na maior parte, uma matriz é um ponteiro para a memória. O tamanho em sua declaração apenas diz ao compilador quanta memória alocar para o array - não está associado ao tipo, então sizeof () não tem nada para continuar.
fonte