C/Visual C - Arreglo de caracteres

 
Vista:

Arreglo de caracteres

Publicado por Clayder (16 intervenciones) el 16/12/2007 23:31:57
Hola a todos:

Vengo de programar en Java y ahora trato de aprender algo de C++. Hace poco deje una entrada sobre punteros, la cual me fue claramente respondida.

Ahora tengo una duda con respecto a los arreglos de caracteres, por ejemplo en estas lineas de codigo:

char c[10] = "Hola Mundo";
cout<<c<<endl;

Al ejecutar esas lineas de codigo me da la siguiente entrada:

Hola Mundoé♥

Me intriga, el porqué los 2 caracteres adicionales, si mi arreglo fuera charc[11](con espacio para un caracter mas), entonces botaría limpio el Hola Mundo;... ¿a que se debe esto?

Ahora, si le agregara una linea mas como:

printf(c1);

Que viene a ser casi lo mismo, el resultado cambiaria el 'é' por el 'ä', como sigue:

Hola Mundoä♥
Hola Mundoä♥

Recuerdo algo que lei de la respuesta de fernando.gomez, sobre el espacio de memoria que el SO para crear objetos, exactamente fue asi:

"Así las cosas, cuando creas un objeto cualquiera, el SO determina el tamaño del objeto y 'reserva' una cantidad de memoria 'alineada' con el mínimo número de segmentos necesarios para que el objeto pueda ser creado. Es decir (en un sistema de 32 bits), si tienes un objeto cuyo tamaño es de 3 bytes, te será reservado un segmento (4 bytes), si tienes un objeto de 5 bytes te serán reservados dos segmentos (8 bytes), etcétera (a este proceso en el cuál te reserva por segmentos en lugar del número exacto de memoria se le llama "alineación" y puede variar en diferentes SOs o procesadores)."

No entendi muy bien lo de alineacion de memoria y porque un objeto de 3 bytes reserva 4 y uno de 5 reserva 8 bytes.

Bueno, disculpen la molestia por lo extenso de mi duda, espero que me respondan y poder aclarar mis dudas.

Gracias de antemano.

Saludos.
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

RE:Arreglo de caracteres

Publicado por fernando.gomez (1603 intervenciones) el 17/12/2007 03:24:57
Qué onda. En C y C++, un vector siempre termina en un elemento nulo. Así el compilador sabe siempre en qué parte de la memoria termina el vector. Las cadenas de texto, al ser array de caracteres, funcionan igual, solo que se provee la sintaxis de las comillas ("...") para hacer el asunto más fácil. Es decir, cuando tú haces:

char c[10] = "Hola Mundo";

el compilador lo "traduce" como:

char c[10] = { 'H', 'o', 'l', 'a', ' ', 'M', 'u', 'n', 'd', 'o', 0 };

donde notarás que el último elemento es un cero. Así, muchas funciones que trabajan con caracteres se van recorriendo todo el array hasta que encuentran un 0. Peeeeeeeero en tu caso tienes que tu array es de 10 caracteres, y la cadena "Hola Mundo" es de once caracteres (diez letras más el nulo). Por eso te funciona cuando amplías la cadena a 11, y no cuando es de 10.

Los dos caracteres extras que te aparecen son parte del segmento de memoria asignado pero están inicializados con basura. Como "sobreescribiste" el caracter nulo, pues las funciones de texto (como el operador << y >>, y printf) se siguen hasta encontrar un 0. En este caso tuviste suerte. Si compilas sin información de depuración (i.e. "release") o con el compilador optimizado, seguramente te mandará un error de memoria inválida.

Así que ya sabes, la regla de oro de las cadenas es que siempre, Siempre, SIEMPRE crees tu variable de cadena de texto con el valor máximo que pretendas más un caracter. Algunos programadores declararían tu variable de la siguiente forma:

char c[10 + 1];

para hacer notar que la longitud es de 10, más el caracter nulo.

Finalmente, quizás te gustaría echar un vistazo a la clase std::string. Ésta es la estándar para trabajar con cadenas de texto, y si en algún momento requieres el array de caracteres, siempre puedes invocar al método string::c_str(). Ejemplo:

#include <string>
using std::string;
...
// sobrecargado el operador de asignación. ya no te preocupas por el tamaño
// ni caracteres nulos ni nada.
string str = "Hola mundo";

// cout y cin están sobrecargados
cout << str << endl;

// siempre puedes emplear el array de caracteres:
printf(str.c_str());

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

RE:Arreglo de caracteres

Publicado por ERICKA (1 intervención) el 10/06/2008 21:31:35
quisiera saber como se hacen los arreglos de caracteres en programacion gracias x atenderme me despido saludosparta todos
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

RE:Arreglo de caracteres

Publicado por Nelek (816 intervenciones) el 17/12/2007 08:48:28
Complementando la gran respuesta de Fernando...

En el caso que quieras usar char por compatibilidades con C y/o vete tu a saber...

Siempre puedes usar char*

char* c = "Hola Mundo";
cout<<c<<endl;
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

RE:Arreglo de caracteres

Publicado por fernando.gomez (1603 intervenciones) el 17/12/2007 17:44:44
Solo habría que explicar que en ese caso tendrías un puntero a memoria estática y constante, y que si intentas modificarla te puede dar un comportamiento indefinido.

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

RE:Arreglo de caracteres

Publicado por Nelek (816 intervenciones) el 18/12/2007 09:14:00
:doh:

Tienes razon, mea culpa
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