¿Por qué el tamaño de una matriz enviada como parámetro no es el mismo que dentro 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
operador devuelve un objeto de tiposize_t
, por lo que debe imprimirlo con%zu
(C99), o enviarlo aint
si usa%d
como arriba en susprintf
llamadas.void PrintSize(int (*p_someArray)[10])
. El interior de la función que se puede acceder a la matriz mediante el uso del operador eliminar la referencia*
:sizeof(*p_someArray)
. Esto tendrá el mismo efecto que usar referencias en C ++.Es un puntero, por eso es una implementación común pasar el tamaño de la matriz como un segundo parámetro a la función
fuente
Como han dicho otros, las matrices se reducen a punteros a su primer elemento cuando se utilizan como parámetros de función. También vale la pena señalar que sizeof no evalúa la expresión y no requiere paréntesis cuando se usa con una expresión, por lo que su parámetro no se usa en absoluto, por lo que también puede escribir sizeof con el tipo en lugar del valor.
fuente
Por lo tanto, deberá pasar la longitud de la matriz como segundo parámetro. Cuando está escribiendo código, en el que ambos declaran una matriz de tamaño constante y luego pasan esa matriz a una función, es una molestia que la constante de longitud de matriz aparezca en varios lugares de su código ...
K&R al rescate:
Entonces ahora puedes hacer, por ejemplo:
fuente
Porque las matrices se descomponen en punteros cuando se pasan como parámetros. Así es como funciona C, aunque puede pasar "matrices" en C ++ por referencia y solucionar este problema. Tenga en cuenta que puede pasar matrices de diferentes tamaños a esta función:
fuente
El comportamiento que encontró es en realidad una gran verruga en el lenguaje C. Siempre que declara una función que toma un parámetro de matriz, el compilador lo ignora y cambia el parámetro a un puntero. Entonces todas estas declaraciones se comportan como la primera:
a será un puntero a int en los cuatro casos. Si pasa una matriz a func, inmediatamente se convertirá en un puntero a su primer elemento. (En un sistema de 64 bits, un puntero de 64 bits es dos veces más grande que un int de 32 bits, por lo que su tamaño de relación devuelve 2.)
El único propósito de esta regla es mantener la compatibilidad con versiones anteriores de los compiladores históricos que no admitían el paso de valores agregados como argumentos de función.
Esto no significa que sea imposible pasar una matriz a una función. Puede evitar esta verruga incrustando la matriz en una estructura (este es básicamente el propósito de std :: matriz de C ++ 11):
o pasando un puntero a la matriz:
En caso de que el tamaño de la matriz no sea una constante en tiempo de compilación, puede usar la técnica de puntero a matriz con matrices de longitud variable C99:
fuente
En c ++ puede pasar una matriz por referencia para este mismo propósito:
fuente
En el lenguaje C, no existe un método para determinar el tamaño de una matriz desconocida, por lo que se debe pasar la cantidad, así como un puntero al primer elemento.
fuente
char[]
las matrices de cadenas).No puede pasar matrices a funciones.
Si realmente desea imprimir el tamaño, puede pasar un puntero a una matriz, pero no será genérico en absoluto, ya que también debe definir el tamaño de la matriz para la función.
fuente
El comportamiento es por diseño.
La misma sintaxis en la declaración de parámetros de función significa algo completamente diferente que en la definición de variable local.
La razón se describe en otras respuestas.
fuente
En lenguaje C, cuando pasa la matriz como argumento a la función, se convierte automáticamente en puntero, la matriz que pasa de una función a otra función se conoce como llamada por referencia. Esa es la razón por la que la función llamada solo recibe el puntero que apunta al primer elemento de la función Esta es la razón
fun (int a []) es similar a fun (int * a);
así que cuando imprima el tamaño de la matriz, imprimirá el tamaño del primer elemento.
fuente
En el lenguaje de programación 'C', 'sizeof ()' es el operador y devuelve el tamaño del objeto en bytes. El argumento del operador 'sizeof ()' debe ser un tipo de valor izquierdo (entero, número flotante, estructura, matriz Así que si quieres saber el tamaño de una matriz en bytes, puedes hacerlo de manera muy simple, solo usa el operador 'sizeof ()' y para su argumento usa el nombre de la matriz, por ejemplo:
La salida en el sistema de 32 bits será: El tamaño de n es: 40.Porque unteger en el sistema de 32 es 4bytes.En 64x es 8bytes.En este caso tenemos 10 enteros declarados en una matriz.Entonces el resultado es '10 * tamaño de ( En t)'.
Algunos consejos:
Si tenemos una matriz declarada como esta 'int n [] = {1, 2, 3, ... 155 ..};'. Entonces queremos saber cuántos elementos se almacenan en esta matriz. Utilice este algoritmo:
sizeof (nombre_del_arreglo) / sizeof (tipo_arreglo)
Código: #include
principal(){
}
fuente
sizeof(n)
para una variable local ysizeof(arg)
un argumento para una función, aunque ambos son aparentemente de tipoint[10]
.Las matrices solo tienen un tamaño reducido. En su mayor parte, una matriz es un puntero a la memoria. El tamaño en su declaración solo le dice al compilador la cantidad de memoria que debe asignar para la matriz; no está asociado con el tipo, por lo que sizeof () no tiene nada que seguir.
fuente