puede realloc Array, entonces ¿Por qué usar punteros?

Esta fue una entrevista de colocación laboral que enfrenté. Nos preguntaron si podemos reallocar Array, le dije que sí. Luego preguntaron: entonces, ¿por qué necesitamos punteros ya que la mayoría de las personas dan razones de que desperdicia espacio en la memoria? No pude dar una respuesta satisfactoria. Si cualquier cuerpo puede dar una respuesta satisfactoria, estaré obligado. Por favor, mencione cualquier situación en la que la declaración anterior pueda contradecir.

Gracias.

2

4 Respuestas

Solo puede reasignar una matriz asignada dinámicamente. Si se asignó estáticamente, no se puede reasignar [con seguridad]. *

Los punteros tienen direcciones de datos en la memoria. Se pueden asignar, desasignar y reasignar dinámicamente utilizando los operadores new/delete en C ++ y malloc/free en C.

Le sugiero encarecidamente que lea El lenguaje de programación C por Kernighan y Ritchie y un texto sólido de C ++ como C ++ From the Ground Up por Herbert Schildt.

El uso de memoria dinámica, punteros, desplazamientos, etc. son fundamentales para utilizar estos dos idiomas. No saber cómo funcionan y por qué existen será una razón probable para que los posibles empleadores lo rechacen.

* el compilador no debería permitirle reasignar nada que haya sido asignado de forma estática, pero si lo hace, el comportamiento no está definido

8
agregado
No he visto su Norma C Anotada, así que no puedo comentar directamente, pero he usado el libro de Ground Up en las clases, y encontré que los estudiantes realmente 'entendieron' usando ese texto
agregado el autor warren, fuente
¿El C ++ de Schildt es mejor que su 'Estándar C anotado'?
agregado el autor Jonathan Leffler, fuente

El fraseo es un poco extraño, pero a mí me parece que la pregunta de la entrevista fue una pregunta abierta diseñada para que usted explique lo que sabe sobre arreglos, punteros, asignación dinámica de memoria, etc. Si yo fuera el entrevistador, me gustaría el candidato para articular las diferencias entre int * a = malloc (10 * sizeof (int)); y int a [10]; . La pregunta de seguimiento no está muy bien redactada, pero probablemente fue un intento de empujar al candidato en la dirección de la diferencia entre un puntero y una matriz y poner en marcha la línea de pensamiento.

5
agregado

DE ACUERDO. No puede reasignar una matriz que ha sido declarada estáticamente. El propósito de usar punteros (en lugar de una matriz estáticamente declarada) sería para poder reasignar el espacio. Supongo que, para ser técnicamente correcto, podría reasignar una matriz estáticamente definida pasándole un puntero, pero no quisiera. El comportamiento no está definido si el puntero está en la memoria que no fue asignada por malloc.

2
agregado
La función realloc nos permite aumentar o disminuir el tamaño de un área previamente asignada. (El uso más común es aumentar un área). Por ejemplo, si asignamos espacio para 512 elementos en una matriz que completamos en el tiempo de ejecución pero encontramos que necesitamos espacio para más de 512 elementos, podemos llamar a realloc.
agregado el autor iankits, fuente
linux.die.net/man/3/realloc - todavía no ayudará con artículos asignados estáticamente
agregado el autor warren, fuente

Realmente no entiendo cómo usar punteros "desperdicia memoria". La función de realloc: -

void *realloc(void *ptr, size_t size);

toma un puntero a la memoria para cambiar el tamaño como un parámetro. Además, hay muchos más usos para los punteros que la memoria dinámica, pasando por referencia, por ejemplo.

1
agregado
"memoria de desechos" podría significar que int * ra = malloc (10 * sizeof (int)); resulta en el uso de más almacenamiento que int ra [10]; debido a la sobrecarga de su implementación malloc. Pero hay mejores razones para usar matrices en la pila donde corresponda.
agregado el autor Steve Jessop, fuente
Ah, y cuando la matriz pertenece a algo representado por una estructura, existe la obvia "pérdida" de memoria que almacena un puntero a la matriz, en lugar de simplemente incrustar la matriz en la estructura y acceder por nombre de miembro, usa un tamaño extra (vacío *) bytes.
agregado el autor Steve Jessop, fuente