C/Visual C - No sé qué hice mal

 
Vista:

No sé qué hice mal

Publicado por Pedro Mayol (5 intervenciones) el 21/11/2020 23:30:23
Hola qué tal, en el siguiente código tenía que pedir dos cadenas y juntarlas en una, y después liberar el espacio de las dos cadenas introducidas. Pero no me sale y no sé que está mal o qué me falta. Si pueden darme una mano, les agradezco.

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
#include <stdio.h>
#include <stdlib.h>
 
char *concatenarcadenas(char *cc1, char *cc2){
    int i, j;
    char *cadena;
 
    for(i=0; cc1[i]!=0; i++){
        cadena[i] = cc1[i];
    }
 
    for(j=0; cc2[j]!=0; i++, j++){
        cadena[i] = cc2[j];
    }
 
    return cadena;
}
 
int main(){
    int tam;
    char *c1, *c2;
 
    printf("Introduce el tamaño máximo de las cadenas de caracteres: ");
    scanf("%d", &tam);
 
    c1 = (char*) malloc(tam*sizeof(char));
    c2 = (char*) malloc(tam*sizeof(char));
 
    printf("Introduce una cadena: ");
    scanf("%s", c1);
    printf("Introduce otra cadena: ");
    scanf("%s", c2);
 
    printf("%s", concatenarcadenas(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
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

No sé qué hice mal

Publicado por Rodrigo (119 intervenciones) el 22/11/2020 23:15:37
El solo hecho de definir un puntero a char solo te da memoria para guardar una direccion de memoria. No te da memoria para copiar y copiar datos.

Es lo que estas haciendo en la funcion concatenarcadenas: defines un puntero a char en la linea 6, lo que esta bien, no pides memoria para copiar los datos que recibes, lo que esta mal, y luego copias hacia lo que apunte el puntero, en las lineas 9 y 13, lo que estaria bien si hubieras pedido memoria, pero ahora estas seguramente pisando memoria a la que no tienes permiso de sobreescribir.

Para mejorarlo solo introduce la peticion de memoria antes de empezar a iterar copiando, entre las lineas 6 y 8, parecido a lo hecho en las lineas 26 y 27, pero esta vez que sea la suma de los tamanos de los strings + 1 ( strlen(cc1) + strlen(cc2) + 1 )

Recuerda, al final del string poner un 0 para marcar el fin de este, sino no va a funcionar bien el printf que tienes en la linea 34.

A proposito de peticion de memoria, es superfluo multiplicar por sizeof(char), porque sizeof(char) es siempre 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

Gracias

Publicado por Pedro Mayol (5 intervenciones) el 22/11/2020 23:22:12
Perfecto, ahora la corrijo. ¡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