2010-09-12 20 views

Respuesta

6

No se puede obtener la longitud de las matrices asignadas dinámicamente en C (2D o de otro modo). Si necesita esa información, guárdela en una variable (o al menos en una forma de calcularla) cuando la memoria esté inicialmente asignada y pase el puntero a la memoria y al tamaño de la memoria juntos.

En su caso prueba anterior sizeof devuelve el tamaño del tipo de lines, y por lo tanto su cálculo de la longitud es equivalente a sizeof(char**)/sizeof(char*) y es probable que tenga el resultado trivial de 1, siempre.

0

Lo pasa junto con su valor. No hay forma de descubrirlo.

1

No se puede obtener la longitud de una matriz asignada dinámicamente en C.

Cuando le sitúa, es necesario almacenar en algún lugar de esa longitud, para que sepa cuánto tiempo es.

Por ejemplo:

int length = ...; 
lines = malloc(length*sizeof(char*)); 

Si tiene que pasar esta alrededor para otras funciones, tendrá que o bien pasarlos como parámetros separados, o definir un tipo de estructura que incluye la longitud y el puntero lines.

2

No puede encontrar el tamaño de una matriz asignada dinámicamente. Si necesita pasar esta matriz a una función, cree una estructura que contenga la matriz y su tamaño.

struct Line { 
    char** text; 
    uint32_t size; 
}; 
2

La implementación subyacente de malloc o new hay que tener inevitablemente un seguimiento del tamaño de la memoria asignada para la variable. Desafortunadamente, no hay una forma estándar de obtener el tamaño del bloque asignado. La razón se debe al hecho de que no todos los bloques de memoria se asignan dinámicamente, por lo que tener la función que solo funciona para la asignación dinámica no es tan útil.

void fillwithzero(int* array) { 
    unsigned int size = getsize(array); // return 0 for statically allocated array ?? 
    for(int i = 0; i < size; i++) { 
     array[i] = 0; 
    } 
} 

Digamos que tenemos getsize función que es capaz de mágicamente obtener el tamaño de la matriz asignada dinámicamente. Sin embargo, si envía un puntero de una matriz estática o una matriz asignada por otros medios (por ejemplo, una función externa) al fillwithzero, esta función no funcionará. Esa es la razón por la cual la mayoría de las funciones C que aceptan matrices requieren que la persona que llama envíe el tamaño o el tamaño máximo de la matriz junto con la matriz misma.

0

Usted puede obtener la longitud de la memoria asignada dinámicamente, SI utiliza el no portátil extensión MSVC/MinGW:

#include <malloc.h> 
char *m = malloc(1234); 
#ifdef __int64 
printf("m size = %lu bytes", _msize(m)); 
#endif 
Cuestiones relacionadas