• [C/C++] Sobre Punteros 2

 #260443  por BlackZeroX
 09 Ene 2011, 09:44
.
Un puntero como sabran es una dirrecion a la memoria.

Bueno la cosa es que esa dirrecion puede asignar a una variable int y de hecho asi lo hacemos todos sin darnos cuenta vean el siguiente ejemplo y reflexionen sobre este asunto.

Lo siguiente lo pondre en C++ ya que me es mas comodo xP pero sirve de igual manera en ANSI C.
Código: [ Debe registrarse para ver este enlace ]

#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{
    char str_msg[99] = "infrAngeluX-Soft\0";
    int int_msg = (int)&str_msg[0];
    cout << "Dirrecion en memoria:\n\t" << int_msg << endl;
    cout << "Contenido:\n\t" << (char*)int_msg << endl;
    cin.get();
    return 666;
}

Es esactamente lo mismo que si ahces esto:
Código: [ Debe registrarse para ver este enlace ]

#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{
    char str_msg[99] = "infrAngeluX-Soft\0";
    char* int_msg = &str_msg[0];
    cout << "Dirrecion en memoria:\n\t" << int_msg << endl;
    cout << "Contenido:\n\t" << *int_msg << endl;
    cin.get();
    return 666;
}

Creando espacio innecesario en memoria

En ocaciones uno hace esto en algunos compiladores:
Código: [ Debe registrarse para ver este enlace ]

#include <stdlib.h>
#include <stdio.h>

int main()
{
    char * xd;
    xd = (char *) malloc( 6);
    xd = "Donuts";
    printf("%s",xd);
    getchar();
}

* Pero realmente esta bien?, jaja no la verdad no esta bien almenos no si no se le realiza un memcpy(), mientras tanto esta mal.

Por que?

* La constante "Donuts" al ya estar en uso en el codigo o programa por ende esta en memoria y como sabran TODO lo que esta en memoria tiene una dirrecion entonces se deduce lo siguiiente:

Si es un compilador o IDE Descontinuado entonces No causara errores en ninguna linea aun que el compilador arreglas orrores asi

El codigo anterior lo corregira mientras compila a este simple codigo:
Código: [ Debe registrarse para ver este enlace ]

#include <stdlib.h>
#include <stdio.h>

int main()
{
    char * xd;
    xd = (char *) malloc( 6);
    xd = (char*)"Donuts";  // <--- Le agrega un Casting....
    printf("%s",xd);
    getchar();
}

Solo le agregara un (char*) y aqui biene otro problema

SI usan malloc o cualquier funcion para obtener espacio o asignacion de memoria entonces es por que:
1.- La llenara el usuario
2.- Se llenara Dinamicamente por codigo
3.- Se COPIARA contenido por medio de otras funciones ( Por ejemplo memcpy(); )
4.- Cualquier mezcla de las anteriores u otras que sean I/O.
continuare mas tarde este escrito..

Otra forma para ver por que esta mal usar asi malloc es este ejemplo de la vida

* Vas a una pizerria y reservas un asiento ( xd = (char *) malloc( 6); )
* Llega un amigo y que lleva a su asiento ( xd = (char*)"Donuts" )

y que paso con el asiento que pediste, pues nada se quedo vacio. la forma de solucionarlo es no usar malloc o usarlo junto con memcpy()

Con el Casting (OJO lo que se le haga a el contenido del apuntador se vera afectado en la constante)
Código: [ Debe registrarse para ver este enlace ]

#include <stdio.h>

int main()
{
    char * xd;
    xd = (char *)"Donuts";
    printf("%s",xd);
    getchar();
}

con memcpy()
Código: [ Debe registrarse para ver este enlace ]

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int main()
{
    char * xd;
    xd = (char *) malloc( 6); // No es nesesario... asi que fuchila...
    memcpy( xd, "Donuts", 6 ); // Aprovechamops el espacio generado por malloc
    printf("%s",xd);
    getchar();
}

Dulces Lunas!¡.
.
 #260506  por linkgl
 09 Ene 2011, 18:20
Interesante lo del memcpy, no lo sabía :O
 #372295  por KHC
 08 Jun 2012, 03:03
Interesante forma de usar memcpy() en lugar de malloc() !
+1