tengo un problema con la siguiente structura
#include <stdio.h>
#include <string.h>
typedef struct producto
{
int precio[1];
char nombre_product[30];
}producto_n;
int main()
{
producto_n producto1;
printf("introduce el nombre del producto : ");
gets(producto1.nombre_product);
printf("introduce el producto sin iva: ");
fflush(stdin);
scanf("%d",&producto1.precio[0]);
producto1.precio[1]=producto1.precio[0]+5;
printf("el producto %s sale $%d",producto1.nombre_product,producto1.precio[1]);
return 0;
}
bueno el problema es que no se imprime el nombre del producto (producto1.nombre_product) se imprime un caracter cualquiera , la verdad no se que puede ser ... la unica forma que pude hacer andar cambiandole la cantidad de vectores de la variable precio a [2] .. alguien me puede ayudar ? S2!
Cuando declaras un array:
int precio[1];
Indicas el numero de elementos (N = 1) y accedes a ellos mediante los indices 0 .. N-1. Como declaras un array de un solo elemento (no tiene caso) accedes a este mediante "precio[0]".
El elemento "precio[1]" no existe ya que seria el segundo elemento del array.
Un saludo
Cita de: rir3760 en 26 Marzo 2013, 19:05 PM
El elemento "precio[1]" no existe ya que seria el segundo elemento del array.
No me queda muy claro a mí eh, ya que he hecho esto y salen dos direcciones de memoria distintas para el precio y dos valores distintos que los he asignado yo, cuando ¿debería dar error por acceder a una memoria que no es la suya al asignarle los valores?:
#include <stdio.h>
#include <string.h>
typedef struct producto
{
char nombre_product[30];
int precio[1];
} producto_n;
int main()
{
producto_n producto1;
producto1.precio[0] = 1;
producto1.precio[1] = 2;
for(int i = 0; i <= 30;++i)
{
producto1.nombre_product[i]='A'+i;
printf("Direcciones de memoria nombre_product[%d]: \t %x \t Valor: %c\n",i,&producto1.nombre_product[i],producto1.nombre_product[i]);
}
printf("Direcciones de memoria nombre_product[%d]: \t %x \t Valor: %d\n",0,&producto1.precio[0],producto1.precio[0]);
printf("Direcciones de memoria nombre_product[%d]: \t %x \t Valor: %d\n",1,&producto1.precio[1],producto1.precio[1]);
return 0;
}
Siendo esta la salida(en breve la pongo):
Direcciones de memoria nombre_product[0]: 5b6d2250 Valor: A
Direcciones de memoria nombre_product[1]: 5b6d2251 Valor: B
Direcciones de memoria nombre_product[2]: 5b6d2252 Valor: C
Direcciones de memoria nombre_product[3]: 5b6d2253 Valor: D
Direcciones de memoria nombre_product[4]: 5b6d2254 Valor: E
Direcciones de memoria nombre_product[5]: 5b6d2255 Valor: F
Direcciones de memoria nombre_product[6]: 5b6d2256 Valor: G
Direcciones de memoria nombre_product[7]: 5b6d2257 Valor: H
Direcciones de memoria nombre_product[8]: 5b6d2258 Valor: I
Direcciones de memoria nombre_product[9]: 5b6d2259 Valor: J
Direcciones de memoria nombre_product[10]: 5b6d225a Valor: K
Direcciones de memoria nombre_product[11]: 5b6d225b Valor: L
Direcciones de memoria nombre_product[12]: 5b6d225c Valor: M
Direcciones de memoria nombre_product[13]: 5b6d225d Valor: N
Direcciones de memoria nombre_product[14]: 5b6d225e Valor: O
Direcciones de memoria nombre_product[15]: 5b6d225f Valor: P
Direcciones de memoria nombre_product[16]: 5b6d2260 Valor: Q
Direcciones de memoria nombre_product[17]: 5b6d2261 Valor: R
Direcciones de memoria nombre_product[18]: 5b6d2262 Valor: S
Direcciones de memoria nombre_product[19]: 5b6d2263 Valor: T
Direcciones de memoria nombre_product[20]: 5b6d2264 Valor: U
Direcciones de memoria nombre_product[21]: 5b6d2265 Valor: V
Direcciones de memoria nombre_product[22]: 5b6d2266 Valor: W
Direcciones de memoria nombre_product[23]: 5b6d2267 Valor: X
Direcciones de memoria nombre_product[24]: 5b6d2268 Valor: Y
Direcciones de memoria nombre_product[25]: 5b6d2269 Valor: Z
Direcciones de memoria nombre_product[26]: 5b6d226a Valor: [
Direcciones de memoria nombre_product[27]: 5b6d226b Valor: \
Direcciones de memoria nombre_product[28]: 5b6d226c Valor: ]
Direcciones de memoria nombre_product[29]: 5b6d226d Valor: ^
Direcciones de memoria nombre_product[30]: 5b6d226e Valor: _
Direcciones de memoria nombre_product[0]: 5b6d2270 Valor: 1
Direcciones de memoria nombre_product[1]: 5b6d2274 Valor: 2
Es curioso porque si pongo la estructura así:
typedef struct producto
{
char nombre_product[30];
int precio[1];
} producto_n;
Se arregla :¬¬
a veces no da error mientras no modifiques algo crítico, es decir si te salís fuera del límite de una cadena y escribís otra, en teoría no pasa nada. Pero si al pasarte fuera, terminás modificando la dirección almacenada de un puntero por ejemplo, entonces si sería una modificación crítica.
array[2] en teoría debería guardar 2 elementos que son array[0] y array[1], si usás [2] sería el tercero. aunque si no tira error debés estar modificando el dato que se encuentra a continuación, o a no ser que el compilador sea inteligente como para haber creado un array de 3.
Cita de: 85 en 26 Marzo 2013, 21:56 PM
a veces no da error mientras no modifiques algo crítico, es decir si te salís fuera del límite de una cadena y escribís otra, en teoría no pasa nada. Pero si al pasarte fuera, terminás modificando la dirección almacenada de un puntero por ejemplo, entonces si sería una modificación crítica.
array[2] en teoría debería guardar 2 elementos que son array[0] y array[1], si usás [2] sería el tercero. aunque si no tira error debés estar modificando el dato que se encuentra a continuación, o a no ser que el compilador sea inteligente como para haber creado un array de 3.
En este caso si le asigno valores a producto1.precio[1] no da error pero asignandolo a producto.precio[2] sí. Bah acabo de mirar en un libro y llevais razón :/
a ver yo tengo entendido que esto :
int precio [1];
es un vector .. donde puedo guardar dos enteros
precio[0];
precio[1];
pero por lo visto ahi no esta el erro , si no, en gets , me equivoco ?
y la dos soluciens posibles son las siguientes :
- Primera Solucion: Cambiar esto ..
typedef struct producto
{
int precio[2];
char nombre_product[30];
}producto_n;
por esto ...
typedef struct producto
{
char nombre_product[30];
int precio[2];
}producto_n;
Muy loco no ?
- Segunda Solucion: Cambiar la cantidad de vectores del vector
int precio[2];
ahora mi pregunta es , realmente donde esta el error ?
Citara ver yo tengo entendido que esto :
Código
int precio [1];
es un vector .. donde puedo guardar dos enteros
Código
precio[0];
precio[1];
No, la respuesta ya te la dio rir3760 anteriormente. Solo podes acceder a la posicion 0 al declarar:
int precio [1];
Saludos