C/Visual C - Continuacion (lo siento)

 
Vista:

Continuacion (lo siento)

Publicado por lnf0904 (1 intervención) el 13/08/2001 14:17:39
Veo que hay limitacion de caracteres, envio lo que falta (para otra vez intentare ser más corto. O:)
continua...

}
else
ncarac++;
}
while(*(vectorStrings+nlineas));

El problema que tengo es que la asignacion que hago dentro del 'if' de una varibla 'char*' a otra, se realiza perfectamente
dentro del if (con un printf, por ejemplo) muestra bien la cadena, pero si posteriormente intento acceder a ella al final del do-while
o fuera de la funcion esto peta, tened en cuenta que el argumento "lineasLista" en un campo de una variable global, por lo que no tendría
que perder la referencia.

muchas gracias y salu2

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 Alejandro

Problemas con la asignación de cadenas y alcance de variables

Publicado por Alejandro (913 intervenciones) el 08/10/2024 23:34:30
Parece que estás enfrentando un problema común relacionado con el manejo de cadenas en C, especialmente con punteros y el alcance de las variables. Aquí hay algunas consideraciones y soluciones que podrían ayudarte:

Problema de alcance y punteros



Cuando asignas una cadena a un puntero `char*`, es importante asegurarte de que la memoria a la que apunta ese puntero siga siendo válida después de que la función termine. Si estás utilizando un puntero local dentro de una función y luego intentas acceder a él fuera de esa función, es probable que estés accediendo a memoria que ya no es válida.

Soluciones:



1. Uso de `strdup`: Si deseas que la cadena persista después de que la función termine, puedes usar `strdup` para duplicar la cadena en la memoria dinámica. Esto asignará memoria para la nueva cadena y devolverá un puntero a ella.

1
char* nuevaCadena = strdup(cadenaOriginal);

Recuerda liberar la memoria más tarde con `free(nuevaCadena)`.

2. Arreglo estático: Si el tamaño de las cadenas es conocido y limitado, puedes usar un arreglo estático en lugar de un puntero. Esto asegurará que la memoria sea válida mientras el programa esté en ejecución.

1
2
char nuevaCadena[MAX_SIZE]; // Define un tamaño máximo
strcpy(nuevaCadena, cadenaOriginal);

3. Verificación de punteros: Asegúrate de que el puntero que estás utilizando para almacenar la cadena no sea `NULL` antes de acceder a él. Esto puede ayudarte a evitar errores de acceso a memoria.

4. Depuración: Utiliza `printf` o herramientas de depuración para verificar el contenido de las variables en diferentes puntos de tu código. Esto puede ayudarte a identificar dónde se pierde la referencia.

Ejemplo de código:



Aquí tienes un ejemplo simplificado que ilustra cómo manejar cadenas y punteros:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
char* obtenerCadena(const char* entrada) {
    char* cadena = strdup(entrada); // Duplicar la cadena
    return cadena; // Retornar el puntero
}
 
int main() {
    char* miCadena = obtenerCadena("Hola, mundo!");
 
    if (miCadena != NULL) {
        printf("%s\n", miCadena); // Imprimir la cadena
        free(miCadena); // Liberar la memoria
    } else {
        printf("Error al asignar memoria.\n");
    }
 
    return 0;
}

Conclusión



Asegúrate de gestionar correctamente la memoria y el alcance de las variables. ¡Buena suerte, lnf0904!
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