Domingo 22 de Diciembre de 2024, 17:23
SoloCodigo
Bienvenido(a),
Visitante
. Por favor,
ingresa
o
regístrate
.
¿Perdiste tu
email de activación?
Inicio
Foros
Chat
Ayuda
Buscar
Ingresar
Registrarse
SoloCodigo
»
Foros
»
Programación General
»
C/C++
(Moderador:
Eternal Idol
) »
Asignacion de memoria
« anterior
próximo »
Imprimir
Páginas: [
1
]
Autor
Tema: Asignacion de memoria (Leído 1492 veces)
Rombus
Miembro MUY activo
Mensajes: 105
Nacionalidad:
Asignacion de memoria
«
en:
Jueves 9 de Octubre de 2008, 17:48 »
0
Hola!
alguien sabe porque me esta dando un segmentation fault en la linea 16 del siguiente codigo?
uso codeblocks con gcc en ubuntu 8.04
Código: C
typedef
struct
pila_s
{
void
*
elementos
;
int
size
;
int
head
;
}
pila_t
;
typedef
struct
{
pila_t
*
pila
;
int
sizeTipo
;
}
pilaAdm_t
;
pilaAdm_t
*
stackCreate
(
int
size
,
int
sizeTipo
)
{
pilaAdm_t
*
stack
=
(
pilaAdm_t
*
)
malloc
(
sizeof
(
pilaAdm_t
)
)
;
void
*
elemens
=
(
void
*
)
malloc
(
size
*
sizeTipo
)
;
stack
->
pila
->
elementos
=
elemens
;
stack
->
pila
->
size
=
size
;
stack
->
pila
->
head
=
0
;
stack
->
sizeTipo
=
sizeTipo
;
return
stack
;
}
cuando la llamo desde el main lo hago de la siguiente forma:
Código: C
int
main
(
void
)
{
pilaAdm_t
*
stack
;
int
n
=
1
;
stack
=
stackCreate
(
n
,
sizeof
(
int
)
)
;
return
0
;
}
espero que alguien me pueda ayudar
gracias!
Tweet
Eternal Idol
Moderador
Mensajes: 4696
Nacionalidad:
Re: Asignacion de memoria
«
Respuesta #1 en:
Jueves 9 de Octubre de 2008, 18:16 »
0
stack->
pila
->elementos = elemens;
El valor de pila es indefinido, esta apuntando generalmente a una direccion erronea.
Nacional y Popular
En mi país la bandera de Eva es inmortal.
Queremos una Argentina socialmente justa, económicamente libre y políticamente soberana.
¡Perón cumple, Evita dignifica!
La mano invisible del mercado me robo la billetera.
Rombus
Miembro MUY activo
Mensajes: 105
Nacionalidad:
Re: Asignacion de memoria
«
Respuesta #2 en:
Jueves 9 de Octubre de 2008, 18:42 »
0
:O!
tenes razon!
Código: C
pilaAdm_t
*
stackCreate
(
int
size
,
int
sizeTipo
)
{
pilaAdm_t
*
stack
=
(
pilaAdm_t
*
)
malloc
(
sizeof
(
pilaAdm_t
)
)
;
pila_t
*
pilaPmd
=
(
pila_t
*
)
malloc
(
sizeof
(
pila_t
)
)
;
stack
->
pila
=
pilaPmd
;
stack
->
pila
->
elementos
=
(
void
*
)
malloc
(
sizeTipo
*
size
)
;
stack
->
pila
->
size
=
size
;
stack
->
pila
->
head
=
0
;
stack
->
sizeTipo
=
sizeTipo
;
return
stack
;
}
excelente!, gracias Eternal Idol, no lo podia ver
ahora me tira el mismo error pero con las instrucciones de push y pop, pero seguro se deben a algo por el estilo de mi error anterior, ahora las veo.
saludos!
Eternal Idol
Moderador
Mensajes: 4696
Nacionalidad:
Re: Asignacion de memoria
«
Respuesta #3 en:
Jueves 9 de Octubre de 2008, 18:49 »
0
De nadas, mucha experiencia depurando
Nacional y Popular
En mi país la bandera de Eva es inmortal.
Queremos una Argentina socialmente justa, económicamente libre y políticamente soberana.
¡Perón cumple, Evita dignifica!
La mano invisible del mercado me robo la billetera.
Rombus
Miembro MUY activo
Mensajes: 105
Nacionalidad:
Re: Asignacion de memoria
«
Respuesta #4 en:
Jueves 9 de Octubre de 2008, 19:02 »
0
jaja
en esta funcion tambien me tira un segmentation fault
Código: C
boolean push
(
pilaAdm_t
*
stack
,
void
*
elemento
)
{
if
(
!
stack
->
pila
||
stackFull
(
stack
->
pila
)
)
return
FALSE
;
//si no hay pila o esta está llena no puedo insertar
memcpy
(
stack
->
pila
->
elementos
+
(
stack
->
sizeTipo
*
stack
->
pila
->
head
++
)
,
elemento
,
stack
->
sizeTipo
)
;
return
TRUE
;
}
en la parte del memcpy, pero no entiendo porque, lo que deberia hacer es copiar elemento, en (posicion 0 de la pila + (size veces por el tipo de dato a guardar)) y el peso del dato a guardar es sizeTipo.
es porque no castiee el stack->pila->elementos de void * a char * y capaz por eso no me permite hacer la aritmetica de punteros?
aunque intente castearlo y tampoco anda :S
saludos!
Eternal Idol
Moderador
Mensajes: 4696
Nacionalidad:
Re: Asignacion de memoria
«
Respuesta #5 en:
Jueves 9 de Octubre de 2008, 19:17 »
0
Haciendo el casting y llamandolo asi me funciona bien:
Código: Text
push(stack, &n);
Fijate que valor se usa como primer parametro a memcpy, deberia ser exactamente stack->pila->elementos.
Nacional y Popular
En mi país la bandera de Eva es inmortal.
Queremos una Argentina socialmente justa, económicamente libre y políticamente soberana.
¡Perón cumple, Evita dignifica!
La mano invisible del mercado me robo la billetera.
Rombus
Miembro MUY activo
Mensajes: 105
Nacionalidad:
Re: Asignacion de memoria
«
Respuesta #6 en:
Jueves 9 de Octubre de 2008, 19:33 »
0
esa!
ahi quedó
era ese (basicamente) mi problema, como la invocaba a la funcion no le estaba pasando la direccion de memoria.
aca tengo el codigo para probarlo que quedo andando:
Código: C
#include <stdio.h>
/*
* Servicios de Pila:
*
* pilaAdm_t *stackCreate(int size, int sizeTipo);
*
* void stackDestroy(stack_t *pila);
*
* boolean push(pilaAdm_t *stack, void *elemento);
*
* boolean pop(pilaAdm_t *stack, void *elemento);
*
* stackEmpty(pila);
*
* stackFull(pila);
*
*/
#ifndef _stdio_h
#include <stdio.h>
#endif
#ifndef _stdlib_h
#include <stdlib.h>
#endif
#ifndef _string_h
#include <string.h>
#endif
#ifndef FALSE
#define FALSE 0
#endif
#ifndef TRUE
#define TRUE !FALSE
#endif
#define stackEmpty(pila) pila->head == 0
#define stackFull(pila) pila->head == pila->size
typedef
char
boolean
;
typedef
struct
{
void
*
elementos
;
int
size
;
int
head
;
}
pila_t
;
typedef
struct
{
pila_t
*
pila
;
int
sizeTipo
;
}
pilaAdm_t
;
pilaAdm_t
*
stackCreate
(
int
size
,
int
sizeTipo
)
;
void
stackDestroy
(
pilaAdm_t
*
pila
)
;
boolean push
(
pilaAdm_t
*
stack
,
void
*
elemento
)
;
boolean pop
(
pilaAdm_t
*
stack
,
void
*
elemento
)
;
pilaAdm_t
*
stackCreate
(
int
size
,
int
sizeTipo
)
{
pilaAdm_t
*
stack
=
(
pilaAdm_t
*
)
malloc
(
sizeof
(
pilaAdm_t
)
)
;
stack
->
pila
=
(
pila_t
*
)
malloc
(
sizeof
(
pila_t
)
)
;
stack
->
pila
->
elementos
=
(
void
*
)
malloc
(
sizeTipo
*
size
)
;
stack
->
pila
->
size
=
size
;
stack
->
pila
->
head
=
0
;
stack
->
sizeTipo
=
sizeTipo
;
return
stack
;
}
void
stackDestroy
(
pilaAdm_t
*
stack
)
{
free
(
stack
->
pila
->
elementos
)
;
free
(
stack
)
;
}
boolean push
(
pilaAdm_t
*
stack
,
void
*
elemento
)
{
if
(
!
stack
->
pila
||
stackFull
(
stack
->
pila
)
)
return
FALSE
;
//si no hay pila o esta esta llena no puedo insertar
memcpy
(
(
char
*
)
stack
->
pila
->
elementos
+
(
stack
->
sizeTipo
*
stack
->
pila
->
head
++
)
,
elemento
,
stack
->
sizeTipo
)
;
return
TRUE
;
}
boolean pop
(
pilaAdm_t
*
stack
,
void
*
elemento
)
{
if
(
!
stack
->
pila
||
stackEmpty
(
stack
->
pila
)
)
return
FALSE
;
//Si no tengo pila, o si esta vacia no puedo hacer pop
stack
->
pila
->
head
--;
//memcpy(elemento, (void *)(((char *)stack->pila->elementos) + (stack->sizeTipo * stack->pila->head)), stack->sizeTipo);
memcpy
(
elemento
,
stack
->
pila
->
elementos
+
(
stack
->
sizeTipo
*
stack
->
pila
->
head
)
,
stack
->
sizeTipo
)
;
return
TRUE
;
}
int
main
(
void
)
{
pilaAdm_t
*
stack
;
int
i
,
a
,
n
=
5
;
stack
=
stackCreate
(
n
,
sizeof
(
int
)
)
;
for
(
i
=
0
;
i
<
5
;
i
++
)
push
(
stack
,
(
void
*
)
&
i
)
;
for
(
i
=
0
;
i
<
5
;
i
++
)
{
pop
(
stack
,
(
void
*
)
&
a
)
;
printf
(
"%dn"
,
a
)
;
}
return
0
;
}
mi idea es meterlo en un archivo stack.c asi lo puedo incluir en mis programas
muchas gracias Eternal idol, no hay nada peor que bloquearse con algo y no poder salir de ahi!
Imprimir
Páginas: [
1
]
« anterior
próximo »
SoloCodigo
»
Foros
»
Programación General
»
C/C++
(Moderador:
Eternal Idol
) »
Asignacion de memoria