C/Visual C - Pregunta sobre la memoria y el realloc() en C

 
Vista:
Imágen de perfil de William Atef
Val: 19
Ha disminuido 1 puesto en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

Pregunta sobre la memoria y el realloc() en C

Publicado por William Atef (11 intervenciones) el 14/04/2020 20:22:02
Hola buenas. Teniendo el cuenta el siguiente código:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
typedef char NAME[100];
typedef char EMAIL[100];
 
typedef struct {
	NAME name;
	EMAIL email;
} CONTACT;
 
int main( int argc, const char * argv[] )
{
	CONTACT * list = NULL;
	char buffer[100];
	int goOn, listSize = 0;
 
	do {
		printf( "Ingrese el nombre del nuevo contacto (0 para terminar):\n " );
		scanf( "%99s", buffer );
		if ( strcmp( "0", buffer ) != 0 ) {
			if ( !list ) {
				list = malloc( sizeof( CONTACT ) );
			} else {
				list = realloc( list, sizeof( CONTACT ) * ( listSize + 1 ) );
			}
			strcpy( list[ listSize ].name, buffer );
			printf( "Ingrese el email de %s:\n", buffer );
			scanf("%99s", buffer);
			strcpy( list[ listSize ].email, buffer );
			goOn = 1;
			listSize++;
		} else {
			goOn = 0;
		}
	} while ( goOn );
 
	printf("\n Esta es tu lista de contactos:\n" );
 
	printf("Nombre\t\tEmail\n");
	for ( int i = 0; i < listSize; i++ ) {
		printf( "%s\t\t\%s\n", list[i].name, list[i].email );
	}
 
	return 0;
}

Tengo una duda respecto al realloc y mi variable puntero. Al incio yo declaro un tipo de dato struct llamado CONTACT. Más abajo creo un puntero que hace referencia a una posición en memoria que contiene un elemento de tipo CONTACT. Después yo uso el malloc y creo el espacio para una variable CONTACT. Hasta aqui todo OK. Si yo accedo a lo que señala el puntero "list", obtendría la variable de tipo CONTACT si yo le asigno el name y el email.
El problema viene cuando yo uso la función realloc y agrando la memoria para "list". Después para acceder a las diferentes instancias tipo CONTACT uso una array. Es decir list[0], list[1]...
Por que es así? Realloc lo que hace es agrandar la memoria y al trozo que agranda le asigna una posición en una array? No entiendo nada y estoy muy confundido la verdad.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de William Atef
Val: 19
Ha disminuido 1 puesto en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

Pregunta sobre la memoria y el realloc() en C

Publicado por William Atef (11 intervenciones) el 14/04/2020 20:47:39
He investigado que por ejemplo si yo tengo int * puntero = malloc(sizeof(int)*25), me guarda el espacio para 25 int y para acceder a cada uno de ellos imaginando que a cada int le he asignado un numero diferente accedería con puntero[i]. Por que es así? Que sucede en el ordenador para que sepa cuando empieza y cuando acaba un int?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Pregunta sobre la memoria y el realloc() en C

Publicado por Nacho (76 intervenciones) el 14/04/2020 22:25:50
El ordenador sólo sabe lo que vale una palabra, un registro. Lo que es y ocupa un int se lo dices tú o el compilador, igual que le dices lo que es CONTACT.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Rodrigo
Val: 350
Bronce
Ha mantenido su posición en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

Pregunta sobre la memoria y el realloc() en C

Publicado por Rodrigo (119 intervenciones) el 14/04/2020 23:10:41
El compilador conoce en tiempo de compilacion el tamano de todos los tipos.
La aritmetica de punteros funciona sumando o restando los tamanos de los tipos apuntados.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar