Discussion:
Duda para los expertos en C sobre cadenas
(demasiado antiguo para responder)
jagg
2004-01-30 08:51:59 UTC
Permalink
Hola a todos. Tengo una duda importante que espero que me resolváis. En el
siguiente código:

void main()
{
char *p;

p="Esto es una prueba";
....
¿Es correcta la asignación a p? No da problemas en ejecución. ¿Se
reserva memoria de forma dinámica para la cadena?

Las mismas cuestiones para la inicialización en la propia definición:

char *p="Esto es una prueba";

¿es esto igual a lo anterior?

Es una duda crucial.

Muchas gracias de antemano.






--------------------------------------------------

Mensaje enviado desde http://grupos.buscadoc.org

--------------------------------------------------
RzR
2004-02-01 22:46:32 UTC
Permalink
Post by jagg
Hola a todos. Tengo una duda importante que espero que me resolváis. En el
void main()
{
char *p;
p="Esto es una prueba";
....
¿Es correcta la asignación a p? No da problemas en ejecución. ¿Se
reserva memoria de forma dinámica para la cadena?
char *p="Esto es una prueba";
¿es esto igual a lo anterior?
Es una duda crucial.
Muchas gracias de antemano.
Deberia funcionarte, ya que al poner "Esto es una prueba" esos datos entre
comillas se guardan tal cual en el archivo ejecutable y luego son cargados
al llamar a este. Por tanto no es memoria dinamica no asignada ni nada asi.
Apuntas un puntero a esa zona de la memoria. Solo tienes que tener cuidado
de no hacer por ejemplo un strcpy y copiarle encima algo mas grande, por lo
demas me parece bien. Corregidme si me equivoco
Loco TheMad
2004-02-01 23:21:34 UTC
Permalink
Post by RzR
Post by jagg
Hola a todos. Tengo una duda importante que espero que me resolváis. En el
void main()
{
char *p;
p="Esto es una prueba";
....
¿Es correcta la asignación a p? No da problemas en ejecución. ¿Se
reserva memoria de forma dinámica para la cadena?
char *p="Esto es una prueba";
¿es esto igual a lo anterior?
Es una duda crucial.
Muchas gracias de antemano.
Deberia funcionarte, ya que al poner "Esto es una prueba" esos datos entre
comillas se guardan tal cual en el archivo ejecutable y luego son cargados
al llamar a este. Por tanto no es memoria dinamica no asignada ni nada asi.
Apuntas un puntero a esa zona de la memoria. Solo tienes que tener cuidado
de no hacer por ejemplo un strcpy y copiarle encima algo mas grande, por lo
demas me parece bien. Corregidme si me equivoco
Pues para mi que no se puede asignar así con un =. Para empezar, "p" es
un puntero a un char, con lo que sólo puede contener una dirección de
memoria. Después se le intenta asignar un literal (que al hacerse con
comillas dobles, incluiría un carácter de final de cadena), cosa que no
sabía que se podía hacer, o por lo menos a mi me da error. Si acaso se
podría hacer una cosa así:
void main(void){
char cadena[]="Esto es una prueba";
char *pCadena;
pCadena=&cadena;
//o bien se imprime uno
printf("%s",cadena);
//o bien se imprime otro
printf("%s",*pCadena);
//pero si se hace esto
printf("%s",pCadena); //error, creo
//estaríamos intentando imprimir una
//cadena donde hay una dirección de
//memoria
}
RzR
2004-02-01 23:31:33 UTC
Permalink
Post by Loco TheMad
Post by RzR
Post by jagg
Hola a todos. Tengo una duda importante que espero que me resolváis. En
void main()
{
char *p;
p="Esto es una prueba";
....
¿Es correcta la asignación a p? No da problemas en ejecución. ¿Se
reserva memoria de forma dinámica para la cadena?
char *p="Esto es una prueba";
¿es esto igual a lo anterior?
Es una duda crucial.
Muchas gracias de antemano.
Deberia funcionarte, ya que al poner "Esto es una prueba" esos datos
entre comillas se guardan tal cual en el archivo ejecutable y luego son
cargados al llamar a este. Por tanto no es memoria dinamica no asignada
ni nada asi. Apuntas un puntero a esa zona de la memoria. Solo tienes que
tener cuidado de no hacer por ejemplo un strcpy y copiarle encima algo
mas grande, por lo demas me parece bien. Corregidme si me equivoco
Pues para mi que no se puede asignar así con un =. Para empezar, "p" es
un puntero a un char, con lo que sólo puede contener una dirección de
memoria. Después se le intenta asignar un literal (que al hacerse con
comillas dobles, incluiría un carácter de final de cadena), cosa que no
sabía que se podía hacer, o por lo menos a mi me da error. Si acaso se
void main(void){
char cadena[]="Esto es una prueba";
char *pCadena;
pCadena=&cadena;
//o bien se imprime uno
printf("%s",cadena);
//o bien se imprime otro
printf("%s",*pCadena);
//pero si se hace esto
printf("%s",pCadena); //error, creo
//estaríamos intentando imprimir una
//cadena donde hay una dirección de
//memoria
}
jagg dijo que a el le funcionaba, asi que ni siquiera me moleste en intentar
compilarlo. La cadena se guarda en tiempo de compilacion y es memoria
estatica. Por otro lado, lo que pones en tu codigo...
Post by Loco TheMad
pCadena=&cadena; <-- eso es incorrecto, apunta a la direccion de cadena, y
cadena es un puntero, si quieres apuntar al primer caracter,
pCadena=cadena; o bien pCadena=&cadena[];

Por otro lado, el ultimo printf que pones es perfectamente correcto. Una
cadena no es mas q un puntero al primer elemento. Todas las funciones de
cadena, strcpy, strlen, lo que reciben son punteros al primer elemento. De
ahi que las cadenas tengan que terminar con un 0, para que las funciones
que las manipulan sepan donde terminan.
Loco TheMad
2004-02-01 23:39:20 UTC
Permalink
Post by RzR
Post by Loco TheMad
Post by RzR
Post by jagg
Hola a todos. Tengo una duda importante que espero que me resolváis. En
void main()
{
char *p;
p="Esto es una prueba";
....
¿Es correcta la asignación a p? No da problemas en ejecución. ¿Se
reserva memoria de forma dinámica para la cadena?
char *p="Esto es una prueba";
¿es esto igual a lo anterior?
Es una duda crucial.
Muchas gracias de antemano.
Deberia funcionarte, ya que al poner "Esto es una prueba" esos datos
entre comillas se guardan tal cual en el archivo ejecutable y luego son
cargados al llamar a este. Por tanto no es memoria dinamica no asignada
ni nada asi. Apuntas un puntero a esa zona de la memoria. Solo tienes que
tener cuidado de no hacer por ejemplo un strcpy y copiarle encima algo
mas grande, por lo demas me parece bien. Corregidme si me equivoco
Pues para mi que no se puede asignar así con un =. Para empezar, "p" es
un puntero a un char, con lo que sólo puede contener una dirección de
memoria. Después se le intenta asignar un literal (que al hacerse con
comillas dobles, incluiría un carácter de final de cadena), cosa que no
sabía que se podía hacer, o por lo menos a mi me da error. Si acaso se
void main(void){
char cadena[]="Esto es una prueba";
char *pCadena;
pCadena=&cadena;
//o bien se imprime uno
printf("%s",cadena);
//o bien se imprime otro
printf("%s",*pCadena);
//pero si se hace esto
printf("%s",pCadena); //error, creo
//estaríamos intentando imprimir una
//cadena donde hay una dirección de
//memoria
}
jagg dijo que a el le funcionaba, asi que ni siquiera me moleste en intentar
compilarlo. La cadena se guarda en tiempo de compilacion y es memoria
estatica. Por otro lado, lo que pones en tu codigo...
Post by Loco TheMad
pCadena=&cadena; <-- eso es incorrecto, apunta a la direccion de cadena, y
cadena es un puntero, si quieres apuntar al primer caracter,
pCadena=cadena; o bien pCadena=&cadena[];
Por otro lado, el ultimo printf que pones es perfectamente correcto. Una
cadena no es mas q un puntero al primer elemento. Todas las funciones de
cadena, strcpy, strlen, lo que reciben son punteros al primer elemento. De
ahi que las cadenas tengan que terminar con un 0, para que las funciones
que las manipulan sepan donde terminan.
De acuerdo. el último printf() es correcto, me acabo de dar cuenta. Pero
de todas formas cadena, al ser también un puntero... vale, me he vuelto
a dar cuenta del fallo (se considera esto arreglo durante la ejecución
de mi respuesta? :P). Bueno, vale, me callo...

L0C0.

Loading...