Problema con puntero a una memoria reservada

Iniciado por fafafa01, 25 Junio 2016, 22:32 PM

0 Miembros y 1 Visitante están viendo este tema.

fafafa01

Buenas, estoy pasando un puntero(que apunta a cierta memoria reservada por malloc) como argumento de una función y adentro de la función quiero saber el largo del arreglo, lo quise hacer del siguiente modo pero me tira un error.


int main( void ) {
float *p,j;
int i=0,tamanio;
scanf("%d",&tamanio);
p=(float*)malloc(tamanio*sizeof(float));
j=funcion(p,i);
}

float funcion(float *n,int i){
if (i==(sizeof(n)/sizeof(float))){
...}
}


el error esta en el if de la función, dice:
error:cannot cast 'float' to 'float*'

si a alguien se le ocurre porque pasa esto, me seria de ayuda, gracias.

AlbertoBSD

#1
Por que en los parametros de la funcion no pasas el tamaño del arreglo?

j=funcion(p,tamanio);

El detalle que en C no hay forma de que otra funcion conozca cuanta memoria reservaste con malloc/calloc/realloc

Saludos
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

geeke

Cita de: fafafa01 en 25 Junio 2016, 22:32 PM
Buenas, estoy pasando un puntero(que apunta a cierta memoria reservada por malloc) como argumento de una función y adentro de la función quiero saber el largo del arreglo, lo quise hacer del siguiente modo pero me tira un error.

Si estas en Windows puedes usar _msize()

#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>

int main( void )
{
   int *buffer = malloc(8 * sizeof(int));
   printf("Size: %u\n",  _msize(buffer));
   free(buffer);
   return 0;
}


En el caso de Linux tienes malloc_usable_size()

AlbertoBSD

Valla no conocia malloc_usable_size

Si lo quieres usar tienes que colocar

#include<malloc.h>

Ahora segun el manual:

CitarNOTES         top

       The value returned by malloc_usable_size() may be greater than the
       requested size of the allocation because of alignment and minimum
       size constraints.  Although the excess bytes can be overwritten by
       the application without ill effects, this is not good programming
       practice: the number of excess bytes in an allocation depends on the
       underlying implementation.

       The main use of this function is for debugging and introspection.

Segun dice que te puede devolver un valor mas grande que el que reservastes originalmente esto devido a cuestiones de alineamiento, y te dice que el principal uso es para depurar.

Mejor también envia el valor de la longitud que puede ser escribible en otra variable como otro argumento en la función.

Saludos!

Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW