2012-04-22 23 views
5

Duplicar posible:
sizeof array of structs in C?
sizeof an array passed as function argumentC - int sizeof gama siempre devuelve 4

Sólo tratando de escribir una función básica sum().

int sum(int arr[]) { 
    int total = 0 , i = 0 , l = sizeof arr; 

    for(i=0;i<l;i++) { 
     total += arr[i]; 
    } 

    return total; 
} 

l siempre equivale a 4 (sé que dividir el tiempo por sizeof int)

Correr Dev-C++ con las opciones del compilador por defecto en Windows 7.

+2

'arr' es un puntero, no una matriz. La sintaxis que utiliza en la declaración de la función es simplemente llamativa para 'int sum (int * arr)'. Le recomendamos leer la sección 6 de las [preguntas frecuentes sobre comp.lang.c] (http://c-faq.com/). – pmg

+0

compile en/para una máquina de 64 bits, debería ver 8 ya que está mirando el tamaño del puntero, no el tamaño de la matriz. –

Respuesta

11

Como argumentos de funciones, matrices de descomposición a los punteros para el tipo de elemento, por lo que sizeof arr es sizeof(elem*).

Tiene que pasar el número de elementos como argumento adicional, no hay forma de determinarlo desde el puntero al primer elemento de la matriz (que es lo que realmente se pasa en esa situación).

+0

Si la pregunta contiene '4', publique 'sizeof (puntero)'

+0

¿Cómo apunto a la matriz misma en lugar del primer elemento? Pasar el largo como un segundo argumento no es una debilidad a la que un programador debe adaptarse. –

+1

Si tiene 'int arr [5];', entonces '& arr' le da un puntero a una matriz de cinco' int', 'int (*) [5]'. La dirección es, sin embargo, la misma que '& arr [0]', la dirección del primer elemento de la matriz. Qué tipo de puntero quieres depende de la situación. Para sumar los elementos de la matriz, a menos que desee tener una función diferente para cada tamaño ('int sum_5 (int (*) [5]);', 'int sum_6 (int (*) [6]);', tiene para pasar un 'int *' y la cantidad de elementos. Así es como funciona C. –