Hola y bienvenido de nuevo. En esta conferencia, quiero ofrecer
una demostración
de nuestro desafío anterior, que consistía en hacer que
entendiera cómo asignar memoria dinámicamente usando malloc.
Simplemente haremos una lectura simple desde el teclado y
luego mostraremos una cadena, pero la usaremos
con punteros asignados dinámicamente, punteros
de caracteres.
Así que veamos los bloques de código para crear un nuevo proyecto.
Y solo vamos a nombrar este ejemplo de asignación de memoria dinámica.
Y lo primero que debe hacer cuando
va a utilizar la asignación de memoria dinámica es asegurarse de que incluye la biblioteca estándar.
Afortunadamente, cuando crea un proyecto en bloques de
código, lo incluirá automáticamente.
Pero la razón por la que necesitamos incluir lib estándar es porque malloc,
la función malloc está ahí. Y malloc, recuerde, es la función
principal para asignar memoria. También tienes calloc.
Calloc es realmente importante porque calloc
hará algunos de los cálculos agradables de cuántos bytes
necesita porque son dos parámetros.
Pero lo realmente bueno de calloc es que inicializa todos los datos
a ceros si son enteros y demás, una función realmente agradable.
Tienes realloc. Realloc ampliará la memoria que ya
se ha asignado. Entonces lo pasas en un puntero.
A partir de ese puntero, determina cuánta memoria se le
asigna y copia todo lo que estaba allí en una nueva ubicación
de memoria, y luego también especifica cuántos bytes más
desea asignar, simplemente lo agrega a la nueva ubicación de memoria, realmente buena característica.
Pero recuerde que cuando asigna memoria para enteros usando malloc,
debe determinar cuánta memoria desea asignar bytes, pero generalmente
desea usar el operador sizeof.
Así que aquí vamos a eso.
En mi método principal, voy a crear un número entero, y solo voy
a decir que será el tamaño. va a ingresar el tamaño de la cantidad de
bytes que desean asignar en tiempo de ejecución, por lo que se almacenará el tamaño.
La otra cosa que quiero crear es que quiero crear un puntero char,
y esto solo será texto. Y voy a inicializar
esto a nulo porque no apunta a nada desde el principio.
Ahora lo primero que quiero hacer es pedirle al usuario que ingrese el tamaño.
Entonces voy a decir
printf, voy a decir ingresa el límite del texto.
Y van a ingresar un número para cuántos bytes quieren que se asignen
realmente sea el número de caracteres.
Y luego voy a leer eso usando scanf.
Scanf, el primer parámetro es el tipo de especificador de formato para el tipo de datos.
Este será un porcentaje d porque estoy leyendo un número entero.
Y luego recuerde, scanf toma un puntero.
Ahora sabemos que las funciones
que toman punteros, necesitan una dirección para pasar.
Entonces, si voy a pasar de tamaño, el tamaño no es una dirección a menos que use la dirección del operador.
Así que voy a ampersand y voy a
decir tamaño, que se leerá en el número de bytes.
Una vez que tenga la cantidad de bytes, ahora puedo asignarle memoria usando la función malloc.
Y malloc devolverá un puntero vacío.
Y el puntero será la primera dirección para
esa memoria recién asignada. Para que pueda asignarlo directamente al texto.
Porque recuerda, el texto es un puntero.
Queremos señalar el texto a esta nueva dirección que se está devolviendo.
Debido a que malloc devuelve un puntero vacío, tenemos que lanzarlo.
El tipo de datos al que apuntamos es un carácter, por lo que queremos decir char
star, y luego podemos llamar a la función malloc.
La función malloc toma el número de bytes.
Y entonces, la cantidad de bytes, si acaba de pasar la cantidad de bytes, solo
asignará esa cantidad de bytes. Pero dependiendo del tipo de datos,
el tipo de datos puede ser de dos o cuatro bytes.
Entonces, si desea asignar 10 caracteres, debe
asegurarse de multiplicar 10
caracteres por el tamaño de char.
Así que ahora vamos
a decir n veces el tamaño de. El operador sizeof se usa a menudo
en la función malloc porque es
independiente de la máquina y le dirá cuánto necesita asignar realmente.
Ahora bien, esto es más relevante cuando tienes números enteros. Recuerde, los números enteros, según el sistema
en el que se encuentre, la arquitectura que esté ejecutando, los
números enteros se pueden representar con cuatro bytes, dos bytes, generalmente
dos o cuatro bytes.
Si dijeras que quiero almacenar un número entero, entonces solo
voy a crear cuatro bytes de memoria, bueno, eso podría no ser correcto
porque ¿qué pasa si son dos bytes?
Por lo tanto, siempre
desea saber cuántos enteros o cuántos caracteres desea crear y luego multiplicar eso por
el tamaño del carácter en su sistema. El operador Sizeof le dará el número de
bytes que ocupa un char. Entonces, si desea crear 10 caracteres,
dice 10 veces el tamaño del carácter. Si desea crear 10 enteros
para almacenar 10 enteros,
dice 10 veces el tamaño de int, eso es realmente importante.
Ahora, con la función calloc, no tienes que hacer eso. Calloc en
realidad toma dos parámetros. Y el primer parámetro
es el puntero creo y luego el
segundo parámetro es el tamaño de bytes.
Entonces, si dice 24 int, entonces todo lo que debe hacer es pasar
solo 24 y asignar automáticamente por usted.
Así que calloc es una herramienta realmente agradable de usar porque no tienes que hacer esta multiplicación.
Entonces, para calloc, el primer parámetro es el tamaño.
Entonces, si quisiera crear 10 int, simplemente pasaría 10.
Y luego el segundo parámetro es
el tamaño del byte. Entonces no tienes que hacer la multiplicación. Te ahorra un poco de paso.
Ahora que asignamos memoria, debe asegurarse
de que el texto no sea nulo antes de intentar quitar la referencia al texto.
Por lo tanto, siempre desea ajustar esto alrededor de un no texto, y eso
dirá que no es nulo o puede hacerlo explícitamente y decir si
el texto no es igual a nulo.
Siempre quiero hacer eso porque es muy, muy peligroso
intentar quitar la referencia a un puntero.
Cualquier cosa podría pasar. Es posible que pueda escribir datos en él.
en ello. Simplemente lo escribiría en algún otro lugar de la memoria. Por lo
tanto, arruinaría su programa o podría tener una falla de segmentación y el programa podría fallar.
Pero siempre que realmente asigne esa
memoria, ahora puede leer algunos datos.
Puede usar git s o puede usar scanf aquí.
Pero lo que desea hacer
es imprimir, ingresar texto y también
queremos agregar saltos de línea aquí para que sean fáciles de leer.
Y usaremos scanf ya que eso es con lo que estamos familiarizados.
Y scanf solo leerá en
porcentaje.
De hecho, te voy a mostrar un truco.
Voy a usar scanf para leer el siguiente carácter para que
haga una pausa y luego voy a usar get s para leer el texto.
Y gets es solo otra función que normalmente puede usar f gets. Solo tiene que configurarlo para configurarlo en
el flujo de entrada.
Pero get va a leer desde el flujo de entrada estándar, que por defecto es el teclado.
Y se va a tomar un puntero. Entonces, todo lo que tenemos que hacer es pasar
texto porque ya es un puntero, no tenemos que ingresar la dirección del operador.
Y lo bueno de get ask es que puedes leer en varias cadenas separadas por espacios.
Una vez que leemos en
get, podemos imprimirlo. Entonces, podemos decir texto ingresado si ingresado
es una palabra por ciento s barra invertida ny
luego texto en coma. El texto es un puntero.
Printf toma un puntero. No tenemos que quitarle la referencia.
Porque si solo muestra texto,
el texto mostrará el valor del puntero que será una dirección.
De hecho, queremos mostrar el valor de lo que apunta el texto.
Y luego terminamos. Oh no, definitivamente no hemos terminado. Queremos llamar a nuestro libre.
Queremos liberar nuestro puntero.
Aunque cuando salgamos, la memoria va a quedar libre. Todavía queremos asegurarnos de liberarlo, y
luego probablemente también lo deseemos solo para su custodia, queremos establecer el texto igual a nulo.
Así que sigamos adelante y construyamos esto y veamos qué sucede.
Y tengo un problema porque no leo en la
variable correcta.
así que aquí no estoy usando la variable correcta. Quiero usar el tamaño y
parece
que estamos bien.
Entonces, aquí vamos, la única diferencia aquí es que no tiene que quitar la
referencia al texto porque el texto es un puntero de carácter.
Solo tiene que quitar la referencia si está en puntero y así sucesivamente. Por lo tanto, cuando
usa el porcentaje s, automáticamente sabe quitar la referencia al
puntero del carácter.
Esa es una diferencia cuando usa punteros de caracteres
frente a otros punteros. Los otros punteros deben
eliminar la referencia para obtener el valor porque en realidad
no puede copiar cadenas en matrices de cadenas, etc.
Nunca podría hacer que el texto de la estrella
sea igual, siempre tendrá que usar la copia str si desea copiar el texto.
Porque recuerde de las conferencias, en realidad no puede
asignar datos a una matriz, y un puntero de carácter es una matriz.
Así que aquí esto parece correcto. No hay razón para quitarle la referencia.
Queremos construir esto y luego queremos ejecutarlo.
Y notarás que ponemos el límite del texto.
Entonces digamos que ingresamos 5, 6 para Jason y se
imprime la entrada es Jason.
Y puedes jugar con este programa. Pero nuevamente, las conclusiones
de esto incluyen lib estándar cuando estás haciendo malloc.
Inicialice los punteros de su carácter a nulo. Haga un escaneo, use
el signo comercial porque el tamaño no es un puntero.
Cuando estás mallocizando, malloc devuelve un puntero vacío, por lo que tienes que lanzar.
Siempre quieres dentro de tu malloc. Haga el operador
sizeof para lo que desea asignar. Veces, cuántos caracteres reales son
o números enteros. Esto es más aplicable a enteros
y tipos de datos primitivos técnicamente para caracteres. Puedes simplemente hacer el tamaño, eso debería funcionar bien.
Siempre desea verificar si es nulo, asegúrese de que no sea nulo.
Cuando vas a usar una cadena de caracteres.
Y luego simplemente ingresamos un texto, lo almacenamos en nuestro get y lo imprimimos.
Y luego, por último, pero no menos importante, siempre queremos liberar nuestros punteros para poder
devolver eso al montón. Espero que esto ayude. Gracias.