Dev - C++ - Problema con malloc

 
Vista:
sin imagen de perfil
Val: 661
Bronce
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Problema con malloc

Publicado por agustin (522 intervenciones) el 20/11/2015 08:35:53
Hola amigos, tengo un problema al reservar memoria e intentar rellenarla. Este es el trozo de codigo:
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
#define SIZE 10
...
...
char *lista[SIZE];
int nPalabras;
 
srand(time(NULL));
ObtenerListaInicial("4_Letras.txt",lista,&nPalabras);
...
...
 
int ObtenerListaInicial(char *nameFile,char *palabra[SIZE],int *nElementos)
{
   int i=0,retval,posPalabra;
   FILE *archivo;
 
   archivo=fopen(nameFile,"rb");
   if(archivo != NULL){
      fseek(archivo,0,SEEK_END);
      *nElementos=ftell(archivo)/SIZE;
      palabra=malloc(*nElementos*sizeof(char*));
      if(palabra != NULL){
         fseek(archivo,0,SEEK_SET);
         do{
            retval=fread(palabra[i],SIZE,1,archivo);
            if(retval != 1)
               break;
            i++;
         }while(!feof(archivo));
      }
      fclose(archivo);
   }else{
      retval=-1;
   }
   return retval;
}

El problema que tengo es con el modo de reservar la memoria y luego escribir en ella. Se que lo estoy haciendo mal porque da una excepcion al intentar escribir en NULL pero no se como hacerlo bien.
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
sin imagen de perfil

Problema con malloc

Publicado por Hector (45 intervenciones) el 21/11/2015 04:10:38
Hola, para crear memoria dinámica en un vector debes de seguir la siguiente sintaxis:

1
2
3
char* d;
 
d = (char*) malloc(n_elementos * sizeof(char));

Nota el casting que se hace para indicar que ese espacio de memoria se usara en un char, si lo ponemos en el caso de una matriz tendrías que hacer lo siguiente:

1
char** d = (char**) malloc (n_elementos * sizeof(char*));

En ese caso estas creando un vector que contendrá punteros de char, estos punteros necesitan alojarse memoria en ellos para ser otros vectores y así ser una "matriz":

1
2
3
4
for(int i = 0; i < n_elementos; i++)
{
     d[i] = (char*) malloc(n_elementos_2 * sizeof(char));
}

Después de eso, puedes acceder a sus datos como si se tratase de una matriz de corchetes.

Aquí te dejo una pequeña referencia:

http://inhaladata.blogspot.com/2015/11/generar-memoria-dinamica-en-c-hasta.html

Saludos.
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
sin imagen de perfil
Val: 661
Bronce
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Problema con malloc

Publicado por agustin (522 intervenciones) el 22/11/2015 11:22:35
Bueno, lo que me explicas lo se pero la duda que tengo es que si hago:
1
2
char *array [10];
array=malloc (sizeof (*array)*2);
No sería lo mismo que hacer estaticamente:
1
char array [2][10];

¿No se puede crear un array de punteros dinámico que apunten a arrays estáticos de esa manera?
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
sin imagen de perfil

Problema con malloc

Publicado por Hector (45 intervenciones) el 22/11/2015 23:14:49
Es interesante lo que propones, pero no estoy seguro si puede funcionar de esa forma:

Para poder asignar memoria necesitas hacerle un casting a la dirección que devolverá malloc, y por las pruebas que hice, no hay un casting apropiado para asignar memoria de la forma que deseas, una solución podría ser crear un struct para así hacer el casting, pero así el código obtiene mas complejidad sin necesidad.

La mejor opción es que alojes la memoria dentro de la función y uses una constante para establecer el limite de letras que podra llevar la palabra.
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 jhonatan

Problema con malloc

Publicado por jhonatan (1 intervención) el 24/11/2015 03:18:33
disculpen me llamo norelli sera que me puedan ayudar en una programacion porfis me urge
Generar diez números aleatorios de un dígito, almacenarlos en un vector, posteriormente solicitar al usuario un número de un dígito para que el programa indique en qué posición se encuentra el número, las veces que aparece repetido y la suma de todos los números aleatorios generados. (Imprimir el vector en orden descendente)
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
sin imagen de perfil
Val: 2
Ha disminuido su posición en 6 puestos en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Problema con malloc

Publicado por Angie (2 intervenciones) el 25/02/2020 05:36:57
Hola chicos
lo que pasa es que en este programa me parece que tengo el MALLOC sin declarar y no me corre:(

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
48
49
50
51
52
53
54
55
56
#include <stdio.h>
#include <conio.h>
 
typedef struct nodo
{
int dato;
struct nodo* siguiente;
}nodo;
 
nodo* primero = NULL;
nodo* ultimo = NULL;
 
void insertarnodo ();
void Imprimir();
 
int main ()
{
	insertarnodo ();
	insertarnodo ();
	insertarnodo ();
	insertarnodo ();
	insertarnodo ();
	Imprimir();
 
	return 0;
	}
 
void insertarnodo (){
	nodo* nuevo= (nodo) malloc(sizeof(nodo));
	printf("Ingrese dato: ");
	scanf ("%d",&nuevo->dato);
 
	if (primero==NULL){
		primero=nuevo;
		primero->siguiente = NULL ;
		ultimo=nuevo;
	}
	else {
		ultimo->siguiente=nuevo;
		nuevo->siguiente= NULL;
		ultimo= nuevo;
	}
}
void Imprimir(){
	nodo* actual=(nodo*) malloc (sizeof(nodo));
	actual=primero;
	if (primero != NULL){
		while(actual!=NULL){
			printf ("%d",actual->dato);
			actual=actual->siguiente;
		}
	}
	else{
		printf ("Cola llena: ");
	}
}
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