copiar caracteres uno a uno

Iniciado por bash, 23 Mayo 2015, 04:53 AM

0 Miembros y 1 Visitante están viendo este tema.

bash

y si uso memset estaria correcto ?  la mayoria de codigo que me entregaron aqui inicializa los punteros con eso , el codigo es c++ pero no puedo usar new y me dijeron que me olvide de malloc q no funciona  :'(
gracias por responder mis dudas

Stakewinner00

memset no reserva memoria, malloc la reserva pero no la inicializa, calloc la reserva y inicializa a 0.

Peregring-lk

#12
Stackewinner, el puntero debe ser constante por que el estándar lo dice, punto. No puedes modificar una cadena de bajo nivel. Punto.

Ahora, ¿por qué el estándar es tan tajante? ¿Por qué tantos "puntos"? Bueno, tiene un motivo relacionado con cómo se implementan tales cadenas.

Un ejecutable, cuando se coloca en memoria, está divido en varias secciones: una es la sección de código (la famosa `.text` en ensamblador), que es donde va el código de la aplicación. Luego dispone de una pila (variables locales, el stack), y un montículo (variables dinámicas -malloc y demás, el heap). Luego hay dos secciones más (que no recuerdo sus nombres), donde van las variables globales inicializadas, y otra donde van las variables globales sin inicializar. El lugar donde van las variables globales sin inicializar es una sección que se inicializa a cero al comenzar el programa (o al menos en Linux; creo que si un SO dado no se divide en tales secciones, el compilador está obligado a inicializar a cero dichas variables globales para emular el comportamiento).

Y por último, está la sección `.rodata`. Ahí es donde van todas las variables globales constantes, y los literales de cadena (es decir, toda cadena de bajo nivel que escribas en tu código fuente irá a esa sección). Si intentas modificar dicha sección (dado que es constante), a través de un puntero por ejemplo, se producirá segmentation fault y el programa se cerrará.

Y por ese motivo, las cadenas son constantes por defecto (`char const*`), porque no se pueden modificar, al estar dentro de la sección constante de tu programa, y que está protegida por el sistema operativo. Si intentas hacerte el listo y modificarlas sí o sí:


char const* str = "cadena de bajo nivel";
void* str_void = str;
char* str = (char*)str_void;
str[1] = 'A';


Ocurrirá lo que he dicho antes, segmentation fault.

Stakewinner00

Le pregunte eso porque el había declarado "char*" en vez de "const char*" y luego dijo
Citarel compilador me da un error cuando trato de compilar con una buffer o char * no constante
pero no preguntaba por nada especial...

Entendiste mal, bueno, no pasa nada.

bash

Stakewinner00 fue mal formulada mi pregunta disculpa !!

Peregring-lk eso es lo que me pasa
gracias por responder mis dudas

Peregring-lk

Perdón Stackewinner0. De todas formas, pensé que era "el autor de éste hilo" (en éste caso bash) quién había hecho esa pregunta (no me fijo mucho en quién es quién la verdad).

Mario Olivera

Código (cpp) [Seleccionar]
int cantidadDigitos= string.length();

for (int i=1; i <= cantidadDigitos;cantidadDigitos++)
{
   despues depende pero, cantidadDigitos[i];
}

bash

me imagino que no es posible con tan limitadas opciones pero me imagino que en otro contexto se podra , ejejeej gracias aprendi algo

la verdad me esta gustando mas esto

una pregunta del mismo tema que ocuparia cada caracter (tamano)?
gracias por responder mis dudas

Peregring-lk

sizeof(char) == 1. El estándar no dice que ésto signifique un byte: para el estándar, un `char`es la unidad mínima de memoria, y por defecto `sizeof(char) == 1`, y cualquier otro tipo se mide en X veces un char. Así, `sizeof(int) == 4` significa que un `int` ocupa lo mismo que 4 `char`s (`char[4]`).

Cuánto ocupe en bytes un `char`se deja a mano del compilador, pero es universalmente 1 y no te vas a encontrar un contraejemplo.

Eternal Idol

#19
Cita de: bash en 23 Mayo 2015, 19:16 PM
y si uso memset estaria correcto ?  la mayoria de codigo que me entregaron aqui inicializa los punteros con eso , el codigo es c++ pero no puedo usar new y me dijeron que me olvide de malloc q no funciona  :'(

No, es incorrecto, si tu puntero es indefinido y se lo pasas a memset lo que estas haciendo es escribir en una direccion indefinida, por eso tu programa genera excepciones no controladas. Usa la pila aunque eso de que malloc no funciona es un delirio ...

Un buen compilador como VC++ genera una advertencia:
d:\src\malo.cpp(10) : warning C4700: uninitialized local variable 'szCopia' used
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón