C/Visual C - Necesito que me expliquen este código por favor, no entiendo muy bien el tema de la memoria dinámica

 
Vista:

Necesito que me expliquen este código por favor, no entiendo muy bien el tema de la memoria dinámica

Publicado por Pedro Mayol (5 intervenciones) el 10/11/2020 21:02:37
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <stdio.h>
#include <stdlib.h>
 
void comparaCadenas(char *cadena1, char *cadena2) {
    int i, j, flag;
 
    for(i=0; cadena1[i]!=0; i++) {
        for(j=flag=0; cadena2[j]!=0; j++)
            if (cadena1[i]==cadena2[j])
                flag=1;
        if (flag)
            printf("El carácter %c aparece en la cadena %s\n", cadena1[i], cadena2);
        else
            printf("El carácter %c NO aparece en la cadena %s\n", cadena1[i], cadena2);
    }
}
 
int main() {
    char *c1, *c2;
    int tam;
 
    printf("Introduce el tamaño máximo de las cadenas de caracteres: ");
    scanf("%d", &tam);
 
    if ((c1 = (char *)malloc((tam+1)*sizeof(char))) == NULL) {
        printf("Error, no se puede reservar memoria para la primera cadena.");
        return 1;
    }
    if ((c2 = (char *)malloc((tam+1)*sizeof(char))) == NULL) {
        printf("Error, no se puede reservar memoria para la segunda cadena.");
        free(c1);
        return 1;
    }
 
    printf("Introduce una cadena: ");
    scanf("%s", c1);
    printf("Introduce otra cadena: ");
    scanf("%s", c2);
 
    comparaCadenas(c1, c2);
 
    free(c1);
    free(c2);
 
    return 0;
}
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

Necesito que me expliquen este código por favor, no entiendo muy bien el tema de la memoria dinámica

Publicado por Nacho (76 intervenciones) el 11/11/2020 14:12:40
Pero si es igual.

Si pones char c1[10], c2[10]; en vez de char* c1, * c2; la única deferencia es que el compilador reserva la memoria para las cadenas. Se usa memoria dinámica porque en el momento de compilar no sabes qué tamaño tendrán las cadenas. En vez de reservar 10000000 chars para que quepa seguro se pregunta núimero de caracteres y se reserva esa cantidad con malloc. Luego se recorre esa memoria exactamente igual para comprobar lo que sea.
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

Necesito que me expliquen este código por favor, no entiendo muy bien el tema de la memoria dinámica

Publicado por Pedro Mayol (5 intervenciones) el 11/11/2020 14:21:05
Gracias, eso lo entiendo igual, pero lo que no termino de entender es la sintaxis de la función malloc.
Por ejemplo:

1
c1 = (char *)malloc((tam+1)*sizeof(char));

Otra cosa que no entiendo es por qué en este programa pone tam+1...
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

Necesito que me expliquen este código por favor, no entiendo muy bien el tema de la memoria dinámica

Publicado por Nacho (76 intervenciones) el 11/11/2020 14:32:46
Memory alloc malloc: void *malloc(size_t size)

Lo único que necesita es la cantidad de bytes que debe reservar, size_t. En ese caso, el tamaño es el del char multiplicado por la cantidad de chars, tam, más uno de caracter final, '\0'.

malloc devuelve un puntero genérico, void*, que se castea al tipo de puntero al que asignas la memoria reservada.
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

Necesito que me expliquen este código por favor, no entiendo muy bien el tema de la memoria dinámica

Publicado por Pedro Mayol (5 intervenciones) el 11/11/2020 15:24:53
Perfecto, muchas gracias.
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
Imágen de perfil de Rodrigo
Val: 350
Bronce
Ha mantenido su posición en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

Necesito que me expliquen este código por favor, no entiendo muy bien el tema de la memoria dinámica

Publicado por Rodrigo (119 intervenciones) el 11/11/2020 17:10:56
sizeof(char) es superfluo, pues es siempre 1. Multiplicar por 1, tambien lo es.
Puedes completamente eliminar la multiplicacion por sizeof(char). Para otro tipo de datos, usa este patron, para char, puedes obviarlo.
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